Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql表插入(如果不存在),否则在非唯一列上更新_Php_Mysql - Fatal编程技术网

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

Php MySql表插入(如果不存在),否则在非唯一列上更新,php,mysql,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是唯一的并且是自动递增的,我需要为用户插入新行,如果该用户的行“colvis”不存在,我需要为该用

在这样的表格中:

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是唯一的并且是自动递增的,我需要为用户插入新行,如果该用户的行“colvis”不存在,我需要为该用户插入新行,即执行类似于“如果不存在,则插入user\u ID=x和name=y ELSE UPDATE”的查询

例如,如果我有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
}
但是不是只有一条班轮吗


我查看了和,但这些都不适用,除非我的“user\u ID”和“name”列是唯一的,是吗?

您正在查找的
插入。在重复密钥更新时
。但首先,您需要一个唯一的索引:

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
,每个“测试”一行,每个“值”一行。在这种情况下,您想要做的很简单:

insert into TestValues(test_id, value)
    values (test_id, val);

请参阅插入。。。在重复键上-并在标准化上阅读以检查此@草莓是否我错了插入。。。只有在列中有唯一值时,重复键才起作用?你说的标准化是什么意思?如果我试图给用户ID添加唯一索引,phpMyAdmin会给出一个错误“#1062-密钥“用户ID”的重复条目“36”。至于存储逗号删除列表:用于在注销后存储DataTable首选项,这些首选项主要是数组。@Konservin。唯一索引有两个键,而不是一个键。看看答案中的例子,我的错。仍然:在重复键更新集val=concat(val,,,,vals(val))上的测试(user_ID,name,val)中插入值(36,'colvis','3');给出错误“#1064-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,了解在第3行“set val=concat(val,,,,values(val))”附近使用的正确语法”在重复密钥更新用户(ID=36)上插入AK#用户(ID,name,value)值(36,'colvis',3,5,6,7,9'),name='colvis',value='3,5,6,7,10';没有给出错误,但也没有更新。@Konservin。我的错。语句中没有
集合
。我只是认为应该有。完美,谢谢:在重复键更新值='3,5,6,7,13'上插入测试(用户ID,名称,值)值(36,'colvis','3,5,6,7,9');作为一个符咒(行更新),并在重复键更新值='3,5,6,7,9'上插入测试(用户ID、名称、值)值(39,'colvis','3,5,6,7,9');也工作(插入行)。问题解决了。只是一个小问题:出于某种原因,当一行被更新时,phpMySql说“插入了2行”,而不是“更新了1行”。为什么呢?