在表中插入行的副本并检查重复项
Posted
技术标签:
【中文标题】在表中插入行的副本并检查重复项【英文标题】:Insert a copy of a row in a table and checking for duplicates 【发布时间】:2021-05-24 18:11:09 【问题描述】:我希望复制数据库中的 4 个现有行,并且需要更改新行中其中一列的值。我需要这样做并确保没有创建重复项。到目前为止我所拥有的是
INSERT INTO table (col1, col2, col3)
SELECT 141, col2, col3,
FROM table
WHERE col1 = 99 AND NOT EXISTS
(SELECT * FROM table WHERE col1 = 141, col2, col3)
但是,当我尝试运行此程序时,我的 (SELECT * FROM table WHERE col1 = 141, col2, col3) 行中的逗号处出现语法错误。
谁能帮忙?
编辑:我的数据库中有 4 行具有以下值
col1 | col 2 | col 3 |
---|---|---|
99 | 1 | Enabled |
99 | 3 | A |
99 | 4 | B |
99 | 5 | C |
我想创建以下行,但首先检查重复项
col1 | col 2 | col 3 |
---|---|---|
141 | 1 | Enabled |
141 | 3 | A |
141 | 4 | B |
141 | 5 | C |
【问题讨论】:
WHERE
不接受逗号。而且你的意图还不清楚。您指定要复制 四个 值,但该语句只有三列。总的来说,我无法理解这个问题。
您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag。 Why should I tag my DBMS
嗨,我已经更新了我的问题,所以我希望这更容易理解:)
【参考方案1】:
我认为您应该在您的选择中使用 EXCEPT 关键字(如果您使用 Oracle,则使用 MINUS):
INSERT INTO table (col1, col2, col3)
SELECT 141, col2, col3,
FROM table
WHERE col1 = 99
EXCEPT
SELECT 141, col2, col3,
FROM table
WHERE col1 = 141;
【讨论】:
【参考方案2】:只需删除 col2 和 col3 即可解决问题。
INSERT INTO table (col1, col2, col3)
SELECT 141, col2, col3
FROM table_name t1
WHERE col1 = 99 AND NOT EXISTS
(SELECT * FROM table_name t2 WHERE t2.col1 = 141 and t1.col2=t2.col2 and t1.col3=t2.col3)
【讨论】:
感谢您的回答。我已经尝试过了,但是如果我的表中已经有一个值为 141 的现有行,它不会添加它需要复制的其他 3 个 @smose 我已更改我的答案以采用这种情况。它现在只会在 col1 中为 141 插入不具有相同 col2 和 col3 的行。【参考方案3】:我现在用以下方法解决了这个问题:
INSERT INTO table (col1, col2, col3)
SELECT 141, col2, col3,
FROM table t
WHERE col1 = 99 AND NOT EXISTS
(SELECT * FROM table nt
WHERE nt.col1 = 141 AND nt.col2 = t.col2 AND nt.col3 = t.col3)
【讨论】:
以上是关于在表中插入行的副本并检查重复项的主要内容,如果未能解决你的问题,请参考以下文章
使用php脚本检查一个表中的重复记录并重复记录插入到另一个表中