有沒有辦法做一個數條件下的刀片,是這樣的:如果表是空的,執行INSERT?
INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1
基本上我想插入一個默認的記錄,如果該表目前是空的。我正在使用mysql。
有沒有辦法做一個數條件下的刀片,是這樣的:如果表是空的,執行INSERT?
INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1
基本上我想插入一個默認的記錄,如果該表目前是空的。我正在使用mysql。
使用SELECT而不是VALUES可以使用WHERE子句擴展查詢。
EXISTS比COUNT
INSERT INTO my_table (colname)
SELECT 'foo'
WHERE NOT EXISTS (SELECT * FROM my_table)
的一種方法是放置在列的唯一密鑰更好&更快的測試。然後執行REPLACE:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
更換作品酷似INSERT, 不同之處在於,如果一個老行的表 具有相同的值作爲一個 主鍵的新行或唯一索引,之前的新行是 插入
+1:當你的答案彈出時,我正要寫這樣的東西。 :) REPLACE的替代方法是使用INSERT IGNORE,當語句執行失敗時,會產生警告(而不是錯誤)。 – 2011-03-15 03:30:48
這種情況很容易讀取舊 行被刪除:
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
比在有大量行的表上執行緩慢的計數要快。
您可能需要使用虛擬表** DUAL **才能使其工作。 INSERT INTO my_table(colname) SELECT'foo'FROM DUAL WHAR NOT EXISTS(SELECT * FROM my_table)' – Craig552uk 2011-06-11 12:16:49
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
@SandeepGB內聯表完全不需要。這是MySQL,而不是Oracle – RichardTheKiwi 2014-05-29 23:14:32