如何使这个sql insert select查询在空表上工作?

jmp7cifd  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(293)

我有以下查询,可以在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的新行。
除非表是空的,否则查询是有效的,在这种情况下,不会插入任何值。
如何修改此查询以同时处理空表?
(注意:我无法在此表上创建唯一索引)

holgip5t

holgip5t1#

不要从表本身中选择,而是从特殊表中选择 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')

相关问题