所以我有以下示例查询
INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');
但是当表为空时,这不起作用。
我认为这样的事情会起作用
INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
(SELECT COUNT(*) FROM company) = 0
OR
NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');
但它也没有用。有什么想法吗?
答案 0 :(得分:3)
仔细查看以下查询:
INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');
由于company
表当前为空,将不会从此查询返回,无论WHERE EXISTS
逻辑是什么,顺便说一句,这是完全正确的。如果您改为使用dual
表,您将看到查询正常运行:
INSERT INTO company (name)
SELECT 'test'
FROM dual
WHERE
NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');
答案 1 :(得分:1)
在prevent autoincrement on MYSQL duplicate insert
之前出现这种情况并不令人惊讶我喜欢这个解决方案
INSERT INTO COMPANY (NAME) SELECT 'TEST' AS INNAME FROM DUAL
WHERE NOT EXISTS(
SELECT NAME FROM COMPANY
WHERE NAME = 'TEST'
LIMIT 1
);
MariaDB [sandbox]> DROP TABLE IF EXISTS COMPANY;
Query OK, 0 rows affected (0.12 sec)
MariaDB [sandbox]> CREATE TABLE COMPANY (ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(10), UNIQUE (NAME));
Query OK, 0 rows affected (0.24 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) VALUES ('TEST');
Query OK, 1 row affected (0.08 sec)
MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) SELECT 'TEST' AS INNAME FROM DUAL
-> WHERE NOT EXISTS(
-> SELECT NAME FROM COMPANY
-> WHERE NAME = 'TEST'
-> LIMIT 1
-> );
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) SELECT 'ABC' AS INNAME FROM DUAL
-> WHERE NOT EXISTS(
-> SELECT NAME FROM COMPANY
-> WHERE NAME = 'ABC'
-> LIMIT 1
-> );
Query OK, 1 row affected (0.10 sec)
Records: 1 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> SELECT * FROM COMPANY;
+----+------+
| ID | NAME |
+----+------+
| 2 | ABC |
| 1 | TEST |
+----+------+
2 rows in set (0.00 sec)
答案 2 :(得分:0)
看起来你在这里重新发明轮子。一种更简单的方法是将name
定义为唯一键(或主键),然后使用insert ignore
语法:
INSERT IGNORE INTO company(name) VALUES ('test')