我有一个简单的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 |
+----+----------+-------+
答案 0 :(得分:1)
您的逻辑意味着尝试插入id
和property
已经出现在表中的新记录应该会导致更新该记录的值。 MySQL提供了一种方法。首先在id
和property
列添加唯一约束:
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)
);