【问题标题】:Insert ignore multiple columns data unique插入忽略多列数据唯一
【发布时间】:2016-02-22 05:02:38
【问题描述】:

我很好奇是否有办法插入 MySQL 并避免重复。我知道实现它的三种主要方法。替换、插入忽略或插入重复键。我相信这些中的每一个都依赖于一个唯一的主键,这对我来说是一个自动增量 id 字段。这个 id 字段对于我的特定插入需求没有任何值,而是我想检查一些字段是否包含相同的值,如果不保险

例如:

INSERT INTO table (name, team, email) VALUES (:n, :t, :e)

如果我有三个这样的数据集

1) array (":n" => "john doe", ":t" => 1, ":e" => john@doe.com);
2) array (":n" => "Jane doe", ":t" => 1, ":e" => john@doe.com);
3) array (":n" => "john doe", ":t" => 1, ":e" => john1@doe.com);
4) array (":n" => "john doe", ":t" => 2, ":e" => john1@doe.com);

假设表中没有值

将插入 1、3 和 4,但不会插入 2,因为团队和电子邮件不是唯一的

我知道我可以创建第四列并将电子邮件和团队添加到其中并创建一个唯一值并使用它,但是我不希望这样做,因为它是冗余数据。

谢谢

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果id 字段对您没有价值,请不要理会它。您描述的所需行为是 composite key 的行为,因此请创建一个复合键。

    首先,废弃存在且没有价值的...

    ALTER TABLE YourTableName DROP PRIMARY KEY;

    然后创建新的复合...

    ALTER TABLE YourTableName ADD PRIMARY KEY (name, team, email);

    【讨论】:

    • 复合键 - 如此简单!
    【解决方案2】:

    您可以创建UNIQUE 约束

     ALTER TABLE `tableName` ADD UNIQUE `unique_idx`(`name`, `team`, `email`);
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用 DUAL

      INSERT INTO table (name, team, email)
      SELECT :n, :t, :e
      FROM DUAL
      WHERE :t NOT IN (SELECT team FROM table WHERE email = :e)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2012-08-11
        • 2011-03-15
        相关资源
        最近更新 更多