MySQL 停止插入基于字段值



如果列具有特定值,我想执行插入忽略。

假设我有一个简单的表,用于记录一段时间内对 PO 的更改。每次更新 PO 时,我都需要在此表上插入一条记录:

PONum | POLine | submittedBy   | ... other columns 
100     1        initial-value
100     1        TB
100     2        initial-value

在 PHP 页面上,我检查此表中是否存在 PO 编号。如果没有,我插入从另一个表找到的所有 PO 行。我将提交者名称设置为"初始值"。

现在稍后,假设添加了 PO 行 3。我想再次运行我的检查,并且只有在还没有第 3 行的初始为 submittedBy 的情况下插入第 3 行的新记录

INSERT IGNORE INTO PODetailCL (PONum, POLine, submittedBy, ... )
VALUES (100, 1, 'TB', ... ),
(100, 2, 'TB', ...),
(100, 3, 'initial-value', ...)
WHERE submittedBy <> 'initial-value' -- <- something like this but not sure of the syntax

尝试使用条件插入多行:

INSERT INTO PODetailCL(PONum, POLine, submittedBy, ... )
SELECT (100, 1, 'TB', ... ), (100, 2, 'TB', ...),(100, 3, 'initial-value', ...)
FROM PODetailCL
WHERE EXISTS (SELECT * FROM PODetailCL WHERE submittedBy <> 'initial-value')

我能够使用虚拟列,然后在该列上添加唯一约束。之后,我可以使用插入忽略。(虚拟列仅在 MySQL 版本 5.7 或更高版本中可用。

ALTER TABLE porelcl 
ADD COLUMN initialCheck BIT GENERATED ALWAYS 
AS (CASE WHEN submittedBy = 'initial-value' THEN b'1' ELSE NULL END)

然后之后:

ALTER TABLE porelcl ADD UNIQUE initial_check_index (PONum, POLine, PORelNum,  initialCheck)

现在,当我的代码再次运行检查时,如果尝试插入重复的记录:SomePO,SomePOLine,SomePORelNum和"初始值",则不会插入,这就是我需要的。

最新更新