在以相反顺序执行另一个查询之前验证查询是否正常工作

时间:2012-01-20 14:57:50

标签: mysql coldfusion

好的,我有一个奇怪的扭曲的更新功能。由于结构的性质,我运行删除查询然后插入查询,而不是实际的“更新”查询。它们专门按此顺序运行,因此不会删除插入的新项目。实质上,项目由插入查询中匹配的属性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>

2 个答案:

答案 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)