更新失败时运行MySQL插入

时间:2018-09-11 19:33:01

标签: mysql insert-update

更新行的最快方法是什么,如果不存在参数,则将其插入。

我的表有2个ID为quote_id, order_id的列,这些列的组合将构成一个唯一列。我不希望2行包含相同的quote_idorder_id,但任何一个都可以有多个行。

id | quote_id | order_id
1  | q200     | o100
2  | q200     | o101
3  | q201     | o100

以前,我将添加第三个字段,并将这两个字段与-合并,以便可以使用ON DUPLICATE KEY UPDATE。但这不是很有效,因为我似乎有时会忘记添加这些字段。

我的想法是尝试运行更新查询,如果插入失败,因为我运行了很多更新查询,然后插入。我将如何将其放入单个查询中,而不是MySQL服务器必须返回错误,然后重新运行插入查询。

if ( UPDATE table_name SET column1=value, column2=value2 WHERE some_column=some_value === ERROR ) THEN INSERT INTO table_name ....

我浏览了一些MySQL文档,但找不到一个示例来说明如何在IF语句中检测到错误

1 个答案:

答案 0 :(得分:2)

对于唯一标识行的列,您应具有PRIMARY或UNIQUE约束。为此,通常使用多列,并且SQL支持语法:

CREATE TABLE MyTable (
  quote_id VARCHAR(4) NOT NULL,
  order_id VARCHAR(4) NOT NULL,
  other_data VARCHAR(4),
  ...
  PRIMARY KEY(quote_id, order_id)
);

然后,您可以依靠唯一约束来导致INSERT失败并改为运行UPDATE:

INSERT INTO MyTable (quote_id, order_id, other_data) VALUES ('q200', 'o100', 'blah blah')
ON DUPLICATE KEY UPDATE 
  other_data = VALUES(other_data);

在UPDATE部分中使用VALUES()子句的意思是“为我试图在INSERT部分中使用的各个列使用相同的值。”