SQL SELECT INSERT INTO生成唯一ID

时间:2012-06-18 18:01:56

标签: sql database select insert sybase

我正在尝试选择一个数据表并将此数据插入到具有相似列名的另一个文件中(它本质上是重复数据)。目前的语法如下:

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

我遇到的问题是为新插入的记录生成唯一的键字段(声明为整数)。我无法使用table2的密钥,因为table1具有现有数据,并且在重复键值时会出错。

我无法更改表架构,这些是自定义ID列,不是由DB自动生成的。

10 个答案:

答案 0 :(得分:8)

table1的id字段是否有自动增量?如果是这样,你可以从插入中丢失similiarId并让自动增量处理唯一键吗?

INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2

答案 1 :(得分:6)

根据您的要求,您需要像这样查询:

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT (ROW_NUMBER( ) OVER ( ORDER BY ID ASC )) 
+ (SELECT MAX(id) FROM TABLE1) AS similiarId
, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

我在这做了什么:
添加了{1}},它将从1开始,因此还为目标表的ID添加了ROW_NUMBER()函数。

为了更好的解释MAX()

答案 2 :(得分:5)

我不确定我是否正确地理解你: 您希望从TABLE2复制所有数据,但要确保TABLE1.similiarId在TABLE1.id中不是alredy,这可能是您的问题的解决方案:

DECLARE @idmax INT
SELECT @idmax = MAX(id) FROM TABLE1

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId + @idmax, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

现在插入不会因为主键违规而失败,因为每个插入的id都会更大,然后id就会在那里出现。

答案 3 :(得分:3)

如果将id字段定义为auto-id并将其从insert语句中删除,则sql将从可用池中生成唯一的id。

答案 4 :(得分:2)

在SQL Server中,我们有函数ROW_NUMBER,如果我理解正确,以下代码将满足您的需求:

    INSERT INTO TABLE1 (id, id2, col1, col2)
    SELECT (ROW_NUMBER( ) OVER ( ORDER BY similiarId2 ASC )) + 6 AS similiarId, 
similiarId2, similiarCol1, similiarCol2  
    FROM TABLE2

ROW_NUMBER将带来每行的编号,您可以为其添加“魔术值”,使这些值与TABLE1的当前最大ID不同。假设您当前的最大ID为6,那么为ROW_NUMBER的每个结果添加6将为您提供7,8,9等等。这样,TABLE1的主键就不会有相同的值。

我问Google,它告诉我Sybase也有函数ROW_NUMBER(http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbusage/ug-olap-s-51258147.html),所以我想你可以尝试一下。

答案 5 :(得分:2)

如果你想制作一个相同的表,为什么不简单地使用(快速和脏)选择INTO方法?

SELECT * INTO TABLE2
FROM TABLE1 

希望这会有所帮助。

答案 6 :(得分:1)

如果table1 ID IDENTITY不是自定义ID,请将其设为ID。

在table1中创建新的主键并使其成为IDENTITY,您可以将以前的ID保持为相同的格式(但不是主键)。

答案 7 :(得分:1)

您最好的选择可能是在Table1上为Table1.Id添加一个额外的列。这样就可以保留两组密钥。

(如果您忙于数据合并,保留Table1.Id对于任何可能仍然引用Table1.Id的外键可能很重要 - 那么您需要在引用Table1.Id的表中“修复”外键,现在需要参考表2中的适用密钥。

答案 8 :(得分:0)

如果你需要你的第二个表保持与第一个表中类似的值,那么不要在第二个表上应用auto increment

答案 9 :(得分:0)

如果你有很大的范围,并且想要快速制作并且不关心ID:

CONCAT示例

INSERT INTO session(SELECT CONCAT("3000", id) as id, cookieid FROM `session2`)

但您也可以使用REPLACE