我有一个完整的培训表。每个用户都有一个用户名。每个用户可以完成许多课程。MySQL:插入或更新,如果存在,但不是基于关键列
该表具有以下标题:
+-------------------------+----------+---------+---------+---------+---------+-----------+
| recordnumber (KEY - AI) | username | type | course | status | started | completed |
+-------------------------+----------+---------+---------+---------+---------+-----------+
| int | varchar | varchar | varchar | varchar | date | date |
+-------------------------+----------+---------+---------+---------+---------+-----------+
而且我有一个PHP脚本设置填充从CSV分贝上传。
我想要实现的是它添加新行,并更新现有的。
问题是,recordnumber(它们的键,唯一字段)不是恒定的。因此,我不想做一个“ON DUPLICATE KEY”查询,而是基于用户名和课程是否已经作为一行存在。
基本上说:“如果这个用户名已经有这个过程,更新其他字段。如果用户名没有这个过程,那么把它作为一个新行添加。
,我都不得不时刻(工作基于键)查询是:
INSERT into table(recordnumber, username,type,course,status,started,completed) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]')
ON DUPLICATE KEY UPDATE username='$data[1]',type='$data[2]',course='$data[3]',status='$data[4]',started='$data[5]',completed='$data[6]'
对我怎么能修改查询任何想法是要检查基于用户名和过程,而不是复制来获得键?
谢谢。 :-)
创建自己的“对重复KEY“型功能。你可以利用IF THEN语句来达到这个效果。请参阅:https://dev.mysql.com/doc/refman/5.5/en/if.html – abalos
在用户名列上创建密钥,然后在重复密钥上使用 –
有许多建议和答案建议执行检查你自己 - 请不要,这些例子中没有一个是并发安全的 - 这意味着你可以(也很可能会)结束重复记录。你应该做的是继续使用'ON DUPLICATE KEY UPDATE'方法,但是你的密钥是'UNIQUE(username,course)'而不是用户名。 – Mjh