【问题标题】:MySQL - INSERT without duplicating rows (without informing the PK)MySQL - 在不重复行的情况下插入(不通知 PK)
【发布时间】:2018-09-25 17:14:50
【问题描述】:

我必须在 mysql 表中插入一些值,但前提是没有其他(几乎)相等的行,例如:

TABLE T
KEY | COL1 | COL2
1   | abc  | 123
2   | def  | 456

KEY列使用自增,我没有在语句上告知,像这样:

INSERT INTO T (COL1, COL2) VALUES (abc, 123)

上面的语句与第一行的值相同。如果该行是这样的重复行,我如何通知 mysql 我不想插入?

我搜索了一些解决方案并找到了INSERT IGNORE, ..ON DUPLICATE KEY UPDATE and REPLACE,我必须在其中通知 PK,但我不知道(不使用额外查询)。

【问题讨论】:

标签: mysql database duplicates


【解决方案1】:

你可以这样做......

>   INSERT INTO memos(id,text) 
>     SELECT 5, 'text to insert' 
>     WHERE NOT EXISTS(SELECT 1 FROM memos WHERE id = 5 AND text = 'text to insert');

【讨论】:

    【解决方案2】:

    ON DUPLICATE KEYINSERT IGNORE 将适用于任何唯一索引,而不仅仅是主键。因此,您可以为这些列添加唯一索引:

    ALTER TABLE T
    ADD UNIQUE INDEX (col1, col2);
    

    使其成为多列索引意味着组合必须是唯一的,即使每一列都可以单独复制。

    【讨论】:

    • 是的,我想,但实际上没有一个是独一无二的,只有整个组合才是
    • 这就是为什么它是一个多列键,这意味着组合必须是唯一的。
    【解决方案3】:
    if not exists(select * from t where col1 = "abc" and col2 ="123")then 
      insert into t (col1,col2) values("abc",123 );
    end if;
    

    【讨论】:

    • IF 语句只能用于过程,不能用于普通查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2023-03-31
    • 2012-10-30
    • 2016-08-14
    • 2017-09-23
    • 2019-08-22
    • 2011-07-29
    相关资源
    最近更新 更多