我有以下查询,该查询对MySQL和MariaDB均适用:
INSERT into some_table (column1, column2, column3, column4, column5)
SELECT 'val1', 'val2', 'val3', 'val4', 'val5'
FROM `some_table`
WHERE NOT EXISTS (
SELECT `column1`, `column2` from `some_table`
WHERE `column1` = 'val1' and `column2` = 'val2'
) limit 1`
它根据val1和val2的唯一值检查行是否存在:如果行存在,则查询不执行任何操作。如果该行不存在,查询将插入一个新行,其值为val1,val2,val3,val4和val5。
查询有效,除非表为空,在这种情况下,不会插入任何值。
如何修改此查询以使其与空表一起使用?
(注意:我无法在此表上创建唯一索引)
答案 0 :(得分:3)
不要从表本身中选择,而是从特殊表DUAL
中选择。
INSERT into some_table (column1, column2, column3, column4, column5)
SELECT 'val1', 'val2', 'val3', 'val4', 'val5'
FROM DUAL
WHERE NOT EXISTS (
SELECT `column1`, `column2` from `some_table`
WHERE `column1` = 'val1' and `column2` = 'val2'
)
DUAL
是一个特殊的虚拟表名称,当您不需要从真实表中提取数据时可以使用它。
另一种选择是在(column1, column2)
上创建唯一索引,然后使用INSERT IGNORE
。如果您尝试创建一个副本,它将被静默跳过。
ALTER TABLE some_table ADD UNIQUE INDEX (column1, column2);
INSERT IGNORE into some_table (column1, column2, column3, column4, column5)
VALUES ('val1', 'val2', 'val3', 'val4', 'val5')