在这样的表中:
ID | user_ID | name | value
1 | 36 | order | {1, 'asc'}
2 | 36 | colvis | 0,1,2,4,7
3 | 36 | colorder | 0,1,2,4,3,5,6,7
4 | 37 | colvis | 0,1,2,4,5,7
只有ID是唯一的和AUTO_INCREMENT,我需要为user_ID = 36和colvis ='something'插入新行,如果该用户的行'colvis'已经不存在,即执行类似'INSERT IF NOT EXIST user_ID = x AND name = y ELSE UPDATE'query。
例如,如果我有user_ID = 36和name ='colorder',它应该更新第3行,但是如果user_ID = 37且name ='colorder',它应该插入新行。与user_ID = 36和name ='filter'相同,它应该插入一个新行。
可以用
完成$exist = $sql->Query("SELECT * FROM test WHERE user_ID = 36 AND name='colvis'");
if ($exist) {
//UPDATE
} else {
// INSERT
}
但是不是有一个单行?
我查看了Insert into a MySQL table or update if exists和MySQL procedure to create or update a row in a table以及MySql Insert if not exist two column pair otherwise update,但这些不适用,除非我的'user_ID'和'name'列是唯一的,是吗?
答案 0 :(得分:2)
您正在寻找insert . . . on duplicate key update
。但首先,您需要一个独特的索引:
create unique index unq_test_userID_name on test(user_ID, name)
然后你可以插入一下:
insert into test(user_ID, name, value)
values (36, 'colvis', '3')
on duplicate key update value values(val);
这里有一个重要的警告:在逗号分隔的列表中存储多个值几乎不是正确的事情。这个规则很少有例外,这就是我回答这个问题的原因。
正确的解决方案可能是联结表TestValues
,每个“test”有一行,每个“value”有一行。在这种情况下,您想要做的很容易:
insert into TestValues(test_id, value)
values (test_id, val);