更新失败时运行MySQL插入

更新失败时运行MySQL插入,mysql,insert-update,Mysql,Insert Update,更新行的最快方法是什么?如果参数不存在,则插入它 我的表有两列idquote\u id,order\u id,这些列组合在一起将形成一个唯一的列。我不希望两行包含相同的quote\u id和order\u id,但其中一行可以有多行 id | quote_id | order_id 1 | q200 | o100 2 | q200 | o101 3 | q201 | o100 以前,我会添加第三个字段,并将这两个字段与-组合,以便在重复密钥更新时使用。但这不是很有

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

我的表有两列id
quote\u id,order\u id
,这些列组合在一起将形成一个唯一的列。我不希望两行包含相同的
quote\u id
order\u id
,但其中一行可以有多行

id | quote_id | order_id
1  | q200     | o100
2  | q200     | o101
3  | q201     | o100
以前,我会添加第三个字段,并将这两个字段与
-
组合,以便在重复密钥更新时使用
。但这不是很有效,因为我有时似乎忘记添加这些字段

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

if(
更新表\u name SET column1=value,column2=value2,其中some\u column=some\u value==错误
)然后
插入表_name…


我浏览了一些MySQL文档,没有找到一个示例来说明如何在
IF
语句中检测到错误。对此使用多列是正常的,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 INTO MyTable (quote_id, order_id, other_data) VALUES ('q200', 'o100', 'blah blah')
ON DUPLICATE KEY UPDATE 
  other_data = VALUES(other_data);

在更新部分中使用VALUES()子句意味着“对插入部分中尝试使用的各个列使用相同的值。”

如果这些字段表示该表的逻辑键,为什么您不能将它们作为主键,并在重复密钥更新中使用
?您读过@David吗?这两个字段本身都不是唯一的,但它们一起是唯一的。有没有办法生成组合列主键?此外,如果您想知道,id列严格来说是数据库中的主键,不会发送给客户端。因此,当更新值时,数据中没有该值。@BillKarwin是的,我以前读过该页的大部分内容,从我收集的内容来看,这对我来说不起作用,因为字段不是唯一的。是的,你可以制作一个复合主键,如
主键(quote\u id,order\u id)