SQL选择插入到生成唯一Id中

SQL选择插入到生成唯一Id中,sql,database,select,insert,sybase,Sql,Database,Select,Insert,Sybase,我试图选择一个数据表,并将该数据插入另一个具有类似列名的文件中(实际上是重复数据)。当前语法如下: INSERT INTO TABLE1 (id, id2, col1, col2) SELECT similiarId, similiarId2, similiarCol1, similiarCol2 FROM TABLE2 我遇到的问题是为新插入的记录生成唯一的键字段(声明为整数)。我不能使用table2的键,因为table1有现有数据,并且会在重复键值时出错 我无法更改表架构,并且这些是数

我试图选择一个数据表,并将该数据插入另一个具有类似列名的文件中(实际上是重复数据)。当前语法如下:

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2
我遇到的问题是为新插入的记录生成唯一的键字段(声明为整数)。我不能使用table2的键,因为table1有现有数据,并且会在重复键值时出错


我无法更改表架构,并且这些是数据库不会自动生成的自定义id列。

如果不是自定义id,请创建table1 id标识


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

table1的id字段是否具有自动递增功能?如果是这样,您是否可以从插入中丢失SimilariaID,并让自动增量处理唯一键

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

您最好在表2中为Table1.Id添加一个附加列。这样,您可以保留两组密钥


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

如果id字段被定义为自动id,而您将其从insert语句中删除,则sql将从可用池中生成唯一id。

在sql Server中,我们有函数行号,如果我正确理解了您,以下代码将满足您的需要:

    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将显示每一行的编号,您可以在其中添加一个“魔法值”,使这些值与表1的当前最大ID不同。假设您当前的最大ID为6,那么将6添加到行数的每个结果将得到7、8、9,依此类推。这样,TABLE1的主键就不会有相同的值


我问过谷歌,它告诉我Sybase也有ROW_NUMBER()函数,所以我想你可以试试。

我不确定我是否正确理解你: 您希望复制表2中的所有数据,但请确保TABLE1.id中不存在TABLE2.SimiliariaId,这可能是您问题的解决方案:

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

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

现在insert不会因为主键冲突而失败,因为每个插入的id都会比原来的id大。

如果要创建一个相同的表,为什么不简单地使用(快速和脏的)Select INTO方法呢

SELECT * INTO TABLE2
FROM TABLE1 

希望这有帮助

根据您的要求,您需要进行如下查询:

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开始的函数,因此还添加了用于目标表ID的函数


为了更好地解释如果您需要第二个表保持与第一个表相似的值,则不要在第二个表上应用
自动增量

如果您拥有大范围,并且希望轻松快速制作,并且不关心ID:

康卡特的例子

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

但是您也可以使用REPLACE

保留键的原始值是否重要?不要从表2中插入similarid,让表1为行生成新id。表1中的id是自定义id吗?如果没有,您可以在ID上使用IDENTITY,它将自动为您创建ID。您可以对table1使用autoincrement,而不要像rs所说的那样在table1中插入SimilId。您不能只在table1中添加一个IDENTITY列,并将新列作为主键吗?然后,您只需在不使用新主键列的情况下执行插入操作,标识就会自动生成密钥。这是一个自定义id,不是由数据库自动递增/生成的。更新数据库架构不是此处的选项,需要函数或sql查询来执行此操作,因为它是一个自定义id。这不是一个自动id字段。更新数据库架构不是此处的选项,需要一个函数或sql查询来实现这一点,因为它是一个自定义id。小心这一个…他们没有指定使用Sybase SQLAnywhere,他们只说了“Sybase”,所以很有可能他们指的是Sybase ASE,据我所知,它没有
行数
函数?@sybkar,谢谢你的评论。在本例中,我建议使用Jarek Bielicki指出的方法,或者如果用户1464435希望保证其顺序的新ID,则使用带有标识列的临时表作为中间表。我建议这样做,只要不经常在大型表上执行(性能问题w/
max
),并且可以更改类似的ID“键”(无引用问题)。否则,他们可能需要创建或使用具有标识的临时表。