我正在编写一个应用程序,我正在使用MySQL作为DBMS,我们正在下载属性提供,并且存在一些性能问题.旧架构看起来像这样:属性更新.如果受影响的行数不是1,则认为更新不成功,否则更新查询将解决我们的问题.如果更新未成功,并且受影响的行数超过1,则我们会重复并删除所有这些行.如果更新未成功,如果需要删除重复项,则会发生插入.这种架构运行良好,但存在一些速度问题,因为如果属性未更新15天,则会删除属性.从理论上讲,主要问题是删除属性,
我们的主持人告诉我使用replace而不是删除属性,所有弃用的属性都应该被视为DEAD.我已经这样做了,但由于语法错误而开始出现问题,我无法找到任何替换为where子句的示例(我想用新属性替换DEAD属性而不是删除旧属性属性并插入一个新的以确保优化).我的查询看起来像这样:
replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue
Run Code Online (Sandbox Code Playgroud)
当然,我已经计算了idValue并处理了所有内容,但我遇到了语法错误.我想知道我是否错了,并且有一个替换的where子句.
我找到了一个替代解决方案,它甚至比替换(更简单地使用更新查询)更好,因为如果我使用替换,删除会发生在窗帘后面,但我想知道当我说那个时我错了replace into没有where子句.有关更多参考,请参阅此链接:
http://dev.mysql.com/doc/refman/5.0/en/replace.html
感谢您提前回答,LajosÁrpád
Iva*_*sen 27
我可以看到你已经解决了问题,但回答了你原来的问题:
REPLACE INTO并不能有一个WHERE条款.
该REPLACE INTO语法的工作原理究竟喜欢INSERT INTO,只是任何旧行具有相同主键或唯一键插入新行之前全自动删除.
这意味着WHERE您应该将主键添加到替换值以限制更新,而不是子句.
REPLACE INTO myTable (
myPrimaryKey,
myColumn1,
myColumn2
) VALUES (
100,
'value1',
'value2'
);
Run Code Online (Sandbox Code Playgroud)
......将提供与...相同的结果
UPDATE myTable
SET myColumn1 = 'value1', myColumn2 = 'value2'
WHERE myPrimaryKey = 100;
Run Code Online (Sandbox Code Playgroud)
......或更确切地说:
DELETE FROM myTable WHERE myPrimaryKey = 100;
INSERT INTO myTable(
myPrimaryKey,
myColumn1,
myColumn2
) VALUES (
100,
'value1',
'value2'
);
Run Code Online (Sandbox Code Playgroud)
在您的文档链接中,它们显示了该命令的三种替代形式replace。即使被省略,唯一可以接受 where 子句的是带有尾随 的第三种形式select。
replaceupdate相对于我正确理解你的任务而言,这似乎有点矫枉过正。