【问题标题】:Insert a copy of a row in a table and checking for duplicates在表中插入行的副本并检查重复项
【发布时间】:2025-12-27 19:15:06
【问题描述】:

我希望复制数据库中的 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”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 嗨,我已经更新了我的问题,所以我希望这更容易理解:)

标签: sql ssms cc


【解决方案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)
    

    【讨论】:

      最近更新 更多