【发布时间】:2020-09-26 13:57:52
【问题描述】:
在执行具有多个值的 INSERT 语句时,我想更新在两个或多个值中包含相同数据的重复条目。
经过一些研究ON DUPLICATE KEY UPDATE 似乎是要走的路。但是,即使在阅读了许多类似的线程之后,我仍然在努力实现它。
我的这个假设是对的吗?如果两行或多行中的值相同,那么替换数据的最佳方法是什么?
我已采取的步骤:
-创建我的数据库
CREATE TABLE IF NOT EXISTS installs (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
userid INT UNSIGNED NOT NULL DEFAULT '0',
email varchar(255) NOT NULL,
addontitle varchar(255) NOT NULL,
addonversion varchar(255) NOT NULL,
bburl varchar(255) NOT NULL,
bbtitle varchar(255) NOT NULL,
webmasteremail varchar(255) NOT NULL,
cookie varchar(255) NOT NULL,
dateline INT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (id),
KEY userid (userid)
)
-通过 PHP 脚本插入数据:
INSERT INTO installs (
username,userid,email,addontitle,addonversion,bburl,bbtitle,webmasteremail,cookie,dateline
) VALUES (
'$username','$userid','$email','$addontitle','$addonversion','$bburl','$bbtitle','$webmasteremail','$cookie',NOW()
)
ON DUPLICATE KEY UPDATE
addontitle = VALUES($addontitle)
但这并不能完全得到我需要的结果。
作为一个例子,这里有一些提交的行:
1 - Bob - 25 - bob@test.com - Addon 1 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
2 - Bob - 25 - bob@test.com - Addon 2 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
3 - Bob - 25 - bob@test.com - Addon 2 - 1.2 - site.com - Some Site - admin@test.com - 13 - DATE
如果插入包含以下值,我希望能够更新第 1 行,因为 $bburl 和 $addontitle 匹配。
4 - Bob - 25 - bob@test.com - Addon 1 - 2.0 - test.com - Test Site - admin@test.com - 13 - DATE
那么表格应该是:
1 - Bob - 25 - bob@test.com - Addon 1 - 2.0 - test.com - Test Site - admin@test.com - 13 - NEWDATE
2 - Bob - 25 - bob@test.com - Addon 2 - 1.0 - test.com - Test Site - admin@test.com - 13 - DATE
3 - Bob - 25 - bob@test.com - Addon 2 - 1.2 - site.com - Some Site - admin@test.com - 13 - DATE
使用ON DUPLICATE KEY UPDATE可以实现这种类型的操作吗?有没有更好的方法?
【问题讨论】:
-
我感觉我今天在stackoverflow.com/questions/62244769/… 之前看到了这段代码。此代码容易受到 sql 注入请阅读stackoverflow.com/questions/60174/… 进一步您需要像 UNIQUE 这样的约束来触发 teh ON DUPICATE
-
我感觉我已经看过几次这个回复了,我不在那里,我会到达那里。提出的问题是我对 ATM 的关注。
标签: mysql database insert duplicates sql-update