2011-03-15 60 views
9

有沒有辦法做一個數條件下的刀片,是這樣的:如果表是空的,執行INSERT?

INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1 

基本上我想插入一個默認的記錄,如果該表目前是空的。我正在使用mysql。

回答

21

使用SELECT而不是VALUES可以使用WHERE子句擴展查詢。

EXISTS比COUNT

INSERT INTO my_table (colname) 
SELECT 'foo' 
WHERE NOT EXISTS (SELECT * FROM my_table) 
+8

您可能需要使用虛擬表** DUAL **才能使其工作。 INSERT INTO my_table(colname) SELECT'foo'FROM DUAL WHAR NOT EXISTS(SELECT * FROM my_table)' – Craig552uk 2011-06-11 12:16:49

+0

INSERT INTO my_table(colname)SELECT'foo'FROM(SELECT'bar')AS BAR WHERE NOT EXISTS(SELECT * FROM my_table) - 內聯虛表 – 2014-05-29 23:02:29

+0

@SandeepGB內聯表完全不需要。這是MySQL,而不是Oracle – RichardTheKiwi 2014-05-29 23:14:32

2

的一種方法是放置在列的唯一密鑰更好&更快的測試。然後執行REPLACE

REPLACE [LOW_PRIORITY | DELAYED] 
    [INTO] tbl_name [(col_name,...)] 
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 

更換作品酷似INSERT, 不同之處在於,如果一個老行的表 具有相同的值作爲一個 主鍵的新行或唯一索引,之前的新行是 插入

+1

+1:當你的答案彈出時,我正要寫這樣的東西。 :) REPLACE的替代方法是使用INSERT IGNORE,當語句執行失敗時,會產生警告(而不是錯誤)。 – 2011-03-15 03:30:48

0

這種情況很容易讀取舊 行被刪除:

INSERT INTO my_table (colname) 
SELECT 'foo' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM my_table); 

缺少VALUES可以通過SELECT FROM DUAL來緩解,它將提供這些值。 FROM DUAL並不總是必需的,但是在需要它的奇怪配置中包含它(比如我使用的Percona的安裝)並沒有什麼壞處。

NOT EXISTS比在有大量行的表上執行緩慢的計數要快。

相關問題