如何在没有密钥的情况下删除插入的记录?

我有 2 个表:Tags 和 TagsTemp。

标签有数百万行,而标签临时有数千行。

它们都是物理表。

两个表中的主键是 ID,它是自动 ID(因此 ID 的编号不同,它们不匹配)。

我必须将所有数据从 TagsTemp 移动到标签。

那很简单。我这样做了:

BEGIN TRANS
INSERT INTO Tags (C1, C2, C3)
SELECT C1, C2, C3 FROM TagsTemp

DELETE FROM TagsTemp

COMMIT

问题在于,TagsTemp 可能在此事务期间(在插入和删除语句之间的时间内)有新记录。

我不想删除包含未插入记录的表。

我在想这样的事情:

BEGIN TRANS
INSERT INTO @T (ID, C1, C2, C3)
SELECT ID, C1, C2, C3 FROM TagsTemp

INSERT INTO Tags (C1, C2, C3)
SELECT C1, C2, C3 FROM @T

DELETE FROM TagsTemp
WHERE ID IN (SELECT ID FROM @T)

COMMIT

但这似乎不是最好的方法和糟糕的表现。

有没有更好的解决方案来做到这一点?

注意:我无法更改表结构。

回答

对于几千行,我认为您的解决方案非常好,但只是为了让您知道另一种方法,您可以MAX(ID)从表中获取然后使用它,假设您的自动 ID 正在递增整数:

BEGIN TRAN;

DECLARE @MaxId INT;

SELECT @MaxId = MAX(ID) from TagsTemp;

INSERT INTO Tags (C1, C2, C3)
SELECT C1, C2, C3
FROM TagsTemp
WHERE ID <= @MaxId;

DELETE
FROM TagsTemp
WHERE ID <= @MaxId;

COMMIT;

PS:不确定你的END TRANS- 我想你的意思是COMMIT


以上是如何在没有密钥的情况下删除插入的记录?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>