SQL SELECT INSERT INTO生成唯一标识(SQL SELECT INSERT INT

2019-09-18 05:45发布

我试图选择数据表并插入这个数据与类似列名的另一个文件(它本质上是重复的数据)。 当前的语法如下:

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

这个问题我已经产生了对新插入的记录唯一键的字段(声明为整数)。 我不能用表2的关键的作为Table具有现有数据,并会错误的重复的键值。

我不能改变表模式,这些都是由DB自动生成自定义ID列没有。

Answer 1:

表1是否有其id字段的自动递增? 如果是这样,你可以从插入失去similiarId,让自动递增照顾唯一键的?

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


Answer 2:

按你的要求,你需要你这样的查询:

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

有什么我这里做:
加入ROW_NUMBER()将从1开始,从而还增加MAX()函数为目标表的ID。

为了更好的说明请参见本SQLFiddle。



Answer 3:

林不知道我是否正确understad你:你要复制来自TABLE2的所有数据,但可以肯定的是TABLE2.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女巫alredy那里。



Answer 4:

如果id字段定义为自动识别你离开它的INSERT语句,然后将SQL生成唯一的ID从可用池中。



Answer 5:

在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,再加入6〜ROW_NUMBER的每个结果将7,8,9,等等给你。 这样,您就不必为TABLE1的主键的值相同。

我已经要求谷歌和它给我说,Sybase拥有的功能ROW_NUMBER太( http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbusage/ UG-OLAP-S-51258147.html ),所以我觉得你可以试试。



Answer 6:

如果你想相同的表,为什么不直接使用(快速和肮脏的)SELECT INTO方法?

SELECT * INTO TABLE2
FROM TABLE1 

希望这可以帮助。



Answer 7:

使table1的ID身份认证,如果不是自定义ID。

要么

在创建新表1的主键,使它的身份,你可以保持以前的ID相同的格式(而不是主键)。



Answer 8:

你最好的选择可能是在表2中添加额外的列Table1.Id。 这样,您就保持两套钥匙。

(如果你是忙于数据合并,保留Table1.Id可以是任何一种可能仍引用Table1.Id任何外键重要的 - 然后你会需要在表格中引用Table1.Id为“修复了”外键,它现在需要参考表2中相应的按键)。



Answer 9:

如果你需要你的第二台保持类似的值作为第一个表,然后DONOT申请auto increment 2日表。



Answer 10:

如果你有大的范围,并希望易迅品牌和不关心ID:

实施例机智CONCAT

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

但你可以使用同时更换



文章来源: SQL SELECT INSERT INTO Generate Unique Id