运行一个MySQL更新失败时插入
Running a MySQL Insert when update fails
更新行的最快方法是什么?如果参数不存在,则插入它。
我的 table 有 2 个 ID 列 quote_id, order_id
,这些列组合起来会成为一个唯一的列。我不想要包含相同 quote_id
和 order_id
的 2 行,但其中任何一个都可以有多行。
id | quote_id | order_id
1 | q200 | o100
2 | q200 | o101
3 | q201 | o100
以前我会添加第三个字段并将这两个字段与 -
组合在一起,这样我就可以使用 ON DUPLICATE KEY UPDATE
。但这不是很有效,因为我有时似乎忘记添加这些字段。
我的想法是尝试 运行 更新查询,如果失败则插入它,因为我 运行 会插入更多更新查询。我如何将其放入单个查询而不是 MySQL 服务器不得不 return 一个错误,然后我重新 运行 插入查询。
if (
UPDATE table_name SET column1=value, column2=value2 WHERE some_column=some_value === ERROR
) THEN
INSERT INTO table_name ....
我查看了一些 MySQL 文档,但找不到说明如何在 IF
语句
中检测到错误的示例
您应该对唯一标识行的列设置 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() 子句意味着 "use the same value for the respective column that I tried to use in the INSERT part."
更新行的最快方法是什么?如果参数不存在,则插入它。
我的 table 有 2 个 ID 列 quote_id, order_id
,这些列组合起来会成为一个唯一的列。我不想要包含相同 quote_id
和 order_id
的 2 行,但其中任何一个都可以有多行。
id | quote_id | order_id
1 | q200 | o100
2 | q200 | o101
3 | q201 | o100
以前我会添加第三个字段并将这两个字段与 -
组合在一起,这样我就可以使用 ON DUPLICATE KEY UPDATE
。但这不是很有效,因为我有时似乎忘记添加这些字段。
我的想法是尝试 运行 更新查询,如果失败则插入它,因为我 运行 会插入更多更新查询。我如何将其放入单个查询而不是 MySQL 服务器不得不 return 一个错误,然后我重新 运行 插入查询。
if (
UPDATE table_name SET column1=value, column2=value2 WHERE some_column=some_value === ERROR
) THEN
INSERT INTO table_name ....
我查看了一些 MySQL 文档,但找不到说明如何在 IF
语句
您应该对唯一标识行的列设置 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() 子句意味着 "use the same value for the respective column that I tried to use in the INSERT part."