10

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

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

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

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

4

10 回答 10

9

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

INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2
于 2012-06-18T18:09:08.443 回答
9

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

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。

于 2012-08-16T06:15:40.260 回答
5

我不确定我是否正确理解了您:您想从 TABLE2 复制所有数据,但请确保 TABLE2.similiarId 不在 TABLE1.id 中,也许这是您问题的解决方案:

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 女巫已经在那里。

于 2012-08-10T14:09:13.280 回答
3

如果 id 字段被定义为 auto-id 并且您将其排除在插入语句之外,那么 sql 将从可用池中生成唯一 id。

于 2012-06-18T18:10:07.187 回答
2

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

SELECT * INTO TABLE2
FROM TABLE1 

希望这可以帮助。

于 2012-08-15T09:31:16.960 回答
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 的主键将不会有相同的值。

我问过谷歌,它告诉我 Sybase 也有 ROW_NUMBER 功能(http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbusage/ ug-olap-s-51258147.html),所以我认为您可以尝试一下。

于 2012-08-10T04:35:59.717 回答
1

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

或者

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

于 2012-06-18T18:09:00.287 回答
1

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

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

于 2012-06-18T18:09:23.833 回答
0

如果您需要第二张桌子保持与第一张桌子相似的值,则不要应用于auto increment第二张桌子。

于 2012-08-16T13:12:26.850 回答
0

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

CONCAT 示例

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

但你也可以使用 REPLACE

于 2018-04-18T03:13:05.817 回答