如果列具有特定值,我想执行插入忽略。
假设我有一个简单的表,用于记录一段时间内对 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和"初始值",则不会插入,这就是我需要的。