如果不存在MySql表插入,否则在非唯一列上更新

时间:2017-01-28 14:59:28

标签: php mysql

在这样的表中:

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 existsMySQL procedure to create or update a row in a table以及MySql Insert if not exist two column pair otherwise update,但这些不适用,除非我的'user_ID'和'name'列是唯一的,是吗?

1 个答案:

答案 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);