代码之家  ›  专栏  ›  技术社区  ›  brainygrunt

如果行中不存在所有值,则插入记录[重复]

  •  0
  • brainygrunt  · 技术社区  · 6 年前

    我有三列:A,B,C。

    如果A、B、C不在一行中,我想插入一个新行。

    使用python来实现这一点。

    INSERT INTO mytable(column_a, column_b, column_c) 
    VALUES(value_a, value_b, value_c) 
    WHERE value_a, value_b, value_c are all unique in existing rows. 
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   GMB    6 年前

    如果您可以实现一种通用机制来避免列_a/b/c上的重复,那么您只需在两列上添加一个复合的唯一约束,例如

    ALTER TABLE mytable 
    ADD CONSTRAINT constr_ID UNIQUE (column_a, column_b, column_c);
    

    如果在表上发生任何将生成重复项的操作,MySQL将引发约束冲突错误。您可以忽略错误 ON DUPLICATE KEY UPDATE 选项:

    INSERT INTO mytable(column_a, column_b, column_c)
    VALUES(value_a, value_b, value_c)
    ON DUPLICATE KEY UPDATE column_a = column_a;
    

    在这 demo on DB Fiddle ,我们将插入3个记录,其中有2个重复项,如预期的那样,我们将在表中插入2个记录。


    另一方面,如果要将重复检查限制为仅一个查询,和/或如果要避免在重复键上浪费自动递增序列,则可以将 INSERT ... SELECT 语句,带有 WHERE NOT EXISTS 执行重复检查的条件:

    INSERT INTO mytable(column_a, column_b, column_c)
    SELECT src.*
    FROM (SELECT value_a column_a, value_b column_b, value_c column_c) src
    WHERE NOT EXISTS (
        SELECT 1 
        FROM mytable
        WHERE 
            column_a = src.column_a 
            AND column_b = src.column_b 
            AND column_c = src.column_c
    );
    

    如果尝试插入副本,查询将不做任何操作(并且不会生成错误或警告)。

    Demo on DB Fiddle .

        2
  •  3
  •   mhawke    6 年前

    一种方法是在三列上创建一个唯一索引。如果试图插入重复的行,数据库将拒绝插入。不需要特殊查询。这应该适用于任何关系数据库,而不仅仅是MySQL。

    使用以下命令创建唯一索引:

    CREATE UNIQUE INDEX a_b_c ON mytable (column_a, column_b, column_c)
    

    插入方式如下:

    INSERT INTO mytable(column_a, column_b, column_c) VALUES (value_a, value_b, value_c)
    

    如果已经存在列值相同的行 column_a , column_b column_c 数据库将拒绝插入,您将在python中看到一个异常。