SQL SELECT INSERT INTO生成唯一ID

use*_*435 9 sql database sybase select insert

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

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2
Run Code Online (Sandbox Code Playgroud)

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

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

ale*_*cey 9

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

INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2
Run Code Online (Sandbox Code Playgroud)


him*_*056 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
Run Code Online (Sandbox Code Playgroud)

我在这做了什么:
添加了ROW_NUMBER()从1开始,所以还添加MAX()了目标表ID的功能.

有关更好的解释,请参阅此SQLFiddle.


Jar*_*cki 5

我不确定我是否正确地理解你:你想复制TABLE2中的所有数据,但要确保在TABLE1.id中TABLE2.similiarId不是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
Run Code Online (Sandbox Code Playgroud)

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


小智 1

如果不是自定义id,则将table1 ID设置为IDENTITY。

或者

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