如何使此sql INSERT SELECT查询在空表上工作?

时间:2018-08-13 21:18:49

标签: mysql sql database mariadb

我有以下查询,该查询对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。

查询有效,除非表为空,在这种情况下,不会插入任何值。

如何修改此查询以使其与空表一起使用?

(注意:我无法在此表上创建唯一索引)

1 个答案:

答案 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')