MySQL更新记录,如果两列匹配数据,否则插入行

时间:2017-07-28 09:09:30

标签: mysql sql database

我有一个简单的MySQL表,有三列:“id”(INT),“property”(VARCHAR)和“value”(VARCHAR)。

所有列必须能够具有相同的记录(即具有相同ID的多个记录)。

这些想法是保存匹配不同ID的不同属性。

我的问题是,如果我的数据与ID和属性相匹配,我将如何更新记录,否则添加新记录?

我最初考虑使用ON DUPLICATE KEY,但这不起作用,因为我的列都不是唯一的。

以下是所需行为的示例:

1:我从这张桌子开始:

+----+----------+-------+
| id | property | value |
+----+----------+-------+
| 45 | money    |   500 |
+----+----------+-------+

2:然后插入:id = 45, property = sex, value = male,我得到:

+----+----------+-------+
| id | property | value |
+----+----------+-------+
| 45 | money    | 500   |
| 45 | sex      | male  |
+----+----------+-------+

3:然后插入:id = 45, property = money, value = 600,我得到:

+----+----------+-------+
| id | property | value |
+----+----------+-------+
| 45 | money    | 600   |
| 45 | sex      | male  |
+----+----------+-------+

4:最后,我可以这样做:id = 46, property = money, value = 600,并获得:

+----+----------+-------+
| id | property | value |
+----+----------+-------+
| 45 | money    | 600   |
| 45 | sex      | male  |
| 46 | money    | 600   |
+----+----------+-------+

1 个答案:

答案 0 :(得分:1)

您的逻辑意味着尝试插入idproperty已经出现在表中的新记录应该会导致更新该记录的值。 MySQL提供了一种方法。首先在idproperty列添加唯一约束:

ALTER TABLE yourTable ADD UNIQUE idx (id, property);

然后使用以下代码执行插入:

INSERT INTO yourTable (id, property, value)
VALUES (45, 'money', 600)
    ON DUPLICATE KEY UPDATE value = 600;

如果您想从头开始创建具有唯一约束的表,您可以尝试这样做:

CREATE TABLE yourTable (
    id int NOT NULL,
    property varchar(255) NOT NULL,
    value int,
    CONSTRAINT uc_idp UNIQUE (id, property)
);