好的,我有一个奇怪的扭曲的更新功能。由于结构的性质,我运行删除查询然后插入查询,而不是实际的“更新”查询。它们专门按此顺序运行,因此不会删除插入的新项目。实质上,项目由插入查询中匹配的属性id删除。由于该属性不是主索引,因此“ON DUPLICATE KEY UPDATE”无效。
所以这就是困境。在开发和测试期间,删除查询将无误地运行,但如果我正在使用INSERT查询的输入并且它失败,那么DATA已被删除而不重新插入,这意味着重新生成新的测试数据,甚至更糟糕的是,如果它在生产中失败,那么用户将失去他们正在处理的所有事情。
所以,我知道MySQL在实际运行之前验证了一个查询,那么在运行DELETE查询之前是否可以确保INSERT查询有效?
<cfquery name="delete" datasource="DSOURCE">
DELETE FROM table
WHERE colorid = 12
</cfquery>
<!--- check this query first before running delete --->
<cfquery name="insert" datasource="DSOURCE">
INSERT INTO table (Name, ColorID)
VALUES ("tom", 12)
</cfquery>
答案 0 :(得分:3)
你有两个问题。
由于该属性不是主索引,因此“ON DUPLICATE KEY UPDATE” 没有用。
属性不必是PRIMARY KEY
。如果它被定义为UNIQUE KEY
就足够了,你可以做到没有惩罚。
排名第二:如果你想按顺序执行一系列查询,所有查询都成功并且没有失败 - 这个术语就是交易。要么都成功要么没有任何反应。谷歌关于MySQL交易,以更好地了解如何使用它们。
答案 1 :(得分:0)
由于您使用WHERE colorid = 12
作为删除标准,因此colorid必须是唯一键。这为您提供了两种使用单个查询来实现此目的的方法
UPDTAE table SET NAME="tom"
WHERE colorid=12
OR
REPLACE INTO table (Name, ColorID)
VALUES ("tom", 12)