MySQL仅在条件为真时插入

ajo*_*jon 1 mysql transactions

我有几个插入语句,我只想在它们为真时执行。

这是我的例子:

START TRANSACTION;

INSERT INTO fields (field_name, control_type_id, needs_approval)
VALUES 
('Array Photos', 3, 0);

INSERT INTO field_to_job_type (field_id, job_type_id, sequence_number, parent_id)
VALUES
(last_insert_id(), (SELECT job_type_id FROM job_types WHERE job_type_name = 'Cash'), 1, (SELECT field_id FROM fields where field_name = 'Photo Pack'));

COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在,如果此查询只有 1 个结果,我真的只想运行第二个查询:

SELECT job_type_id FROM job_types WHERE job_type_name = 'Cash'.

如果该查询返回 2 个结果,我想放弃交易。

那可能吗?我试过的东西:

START TRANSACTION;
INSERT ...;
INSERT ...;
IF(SELECT count(job_type_name) FROM job_types WHERE job_type_name = 'Cash') = 1, 'COMMIT', 'ROLLBACK');
Run Code Online (Sandbox Code Playgroud)

哪个,显然没有用。

Col*_*ica 5

您可以WHERE为此使用子句。将您的 INSERT VALUES 转换为 INSERT SELECT 并添加WHERE子句。

例如,

INSERT INTO fields (field_name, control_type_id, needs_approval)
SELECT
'Array Photos', 3, 0
WHERE Condition;
Run Code Online (Sandbox Code Playgroud)

如果 Condition 为真,它将插入该行。如果 Condition 为 false,SELECT则将返回零行,因此 INSERT 将插入零行。

如果上面的查询由于语法错误而无法运行,您可以像@spencer7593 提到的那样,添加FROM DUAL.

INSERT INTO fields (field_name, control_type_id, needs_approval)
SELECT
'Array Photos', 3, 0
FROM DUAL
WHERE Condition;
Run Code Online (Sandbox Code Playgroud)

DUAL表本质上是一个虚拟表,具有可预测的内容,并且可以依赖于始终至少有一行

  • **`错误代码 1604: ... 'WHERE 1=1' 附近使用的正确语法`** (2认同)