2017-09-03 121 views
2

的存在使得我有以下示例查詢MySQL的 - INSERT SELECT WHERE不能在空表

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'); 

但它也不能工作。有任何想法嗎?

http://sqlfiddle.com/#!9/5747f0/1

+0

請更新您的問題,並說明你究竟想在這裏發生什麼。 –

+0

@TimBiegeleisen我不知道如何更清楚地描述它。如果名稱不存在(應該在表被填充時已經有效)或者表爲空(當表爲空時,當前查詢不起作用),它應該插入。所以唯一的錯誤是在表空時修復它。 –

+0

我似乎無法重現你的例子([見這裏](http://rextester.com/SJN88611))。也許你應該給一個可重複的例子。 –

回答

1

仔細查看下面的查詢:

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'); 
0

它看起來像你在這裏重新發明輪子。一個更簡單的方法是定義name作爲一種獨特的鍵(或主鍵),然後使用insert ignore語法:

INSERT IGNORE INTO company(name) VALUES ('test') 
+0

我不希望「插入IGNORE」的原因是因爲我不希望每次有人試圖插入相同的名稱時id都會增加。 –

+0

然後你當前的查詢將無法做到這一點......插入將被阻止,沒有東西會增加。 –

+0

@TimBiegeleisen不知道你的意思,但是當我運行原始查詢(並且數據庫中已經存在某些內容)時,如果已經存在相同的名稱,則該ID不會增加 –

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) 
+0

只比Tim稍慢,但謝謝。 –