在表中插入行的副本并检查重复项

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)

【讨论】:

以上是关于在表中插入行的副本并检查重复项的主要内容,如果未能解决你的问题,请参考以下文章

我试图在表中插入数据,但数据未存储在表中[重复]

为mysql中的每个查询结果在表中插入行[重复]

使用php脚本检查一个表中的重复记录并重复记录插入到另一个表中

Laravel 5.1用eloquent删除DB中的重复项

如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句

如何检查未插入表中的重复值?