【问题标题】:MySQL INSERT if one of primary key value doesn't match如果主键值之一不匹配,则 MySQL INSERT
【发布时间】:2011-07-21 23:25:10
【问题描述】:

我想做这样的 MySQL 查询:


if((value1 != dbPrimaryValue1) OR (value2 != dbPrimaryValue2))
      INSERT ROW
else
      DO NOTHING

让我们试试例子:


CREATE TABLE `tmp` (
    `one` int NOT NULL,
    `two` int NOT NULL,
    `three` int NOT NULL);

ALTER TABLE `tmp`
ADD PRIMARY KEY (`one`, `two`);

INSERT INTO `tmp`
    (`one`, `two`, `three`)
    VALUES (1,2,3);

INSERT INTO `tmp`
    (`one`,`two`,`three`) 
    VALUES (10,20,30),
           (1,999,999),
       (999,2,999),
       (1,2,999)
    ON DUPLICATE KEY 
           UPDATE `one` = `one`; // or some dummy no-source-drain operation

结果在这里:


select * from tmp;
+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
|   1 |   2 |     3 |
|  10 |  20 |    30 |
|   1 | 999 |   999 |
| 999 |   2 |   999 |
+-----+-----+-------+

你希望得到这样的结果:


 select * from tmp;
+-----+-----+-------+
| one | two | three |
+-----+-----+-------+
|   1 |   2 |     3 |
|  10 |  20 |    30 |
+-----+-----+-------+

是否可以进行此查询?我正在使用大量数据和过程,如 load -> compare -> save 是不可能的。谢谢!

【问题讨论】:

    标签: mysql insert unique-key not-exists


    【解决方案1】:

    只需使两个字段分别唯一。例如:

    CREATE TABLE `tmp` (
        `one` int NOT NULL UNIQUE,
        `two` int NOT NULL UNIQUE,
        `three` int NOT NULL);
    

    或通过以下方式添加约束:

    ALTER TABLE `tmp` ADD UNIQUE (`one`);
    ALTER TABLE `tmp` ADD UNIQUE (`two`);
    

    【讨论】:

      【解决方案2】:

      如果你创建一个UNIQUE 键约束,数据库将不允许你自动插入它们。

      来自MySQL forum:

      唯一索引创建一个约束 这样索引中的所有值都必须 与众不同。如果您发生错误 尝试使用键值添加新行 匹配现有行。对所有人 引擎,唯一索引允许 列的多个 NULL 值 可以包含 NULL。

      【讨论】:

        猜你喜欢
        • 2012-07-07
        • 2017-04-14
        • 2016-09-28
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多