2010-02-08 35 views
13

是否有一個查詢將只檢查記錄,如果不存在insert?我不想重複更新或替換。尋找一個查詢解決方案,看看其他答案,但不是真正希望的。mysql條件插入 - 如果不存在insert

表:

name|value|id 
------------------ 
phill|person|12345 

僞查詢:

IF NOT EXISTS(name='phill', value='person', id=12345) INSERT INTO table_name 
+1

你能澄清一下這個問題嗎? id是唯一唯一的字段嗎? (以一種快速且骯髒的方式,您可以使用唯一的索引,如果您嘗試插入具有重複值的行,它將會失敗)。 名稱和價值是否也必須獨一無二? – 2010-02-08 17:07:30

+0

所有三個值都是唯一的,不能爲空。 ID有一個索引,名稱和值應該不同,但ID是必須的 – 2010-02-08 17:13:05

回答

18

使用REPLACE - 工程酷似INSERT,不同之處在於,如果一個老行的表具有相同的值作爲一個新行PRIMARY KEY或UNIQUE索引,舊行在插入新行之前被刪除。

http://dev.mysql.com/doc/refman/5.0/en/replace.html

-- For your example query 
REPLACE INTO table_name(name, value, id) VALUES 
('phill', 'person', 12345) 

編輯:既然你不能使用取代另一種選擇是:爲表數據集約束索引(主鍵,唯一性),並使用INSERT忽略

INSERT IGNORE INTO table_name 
SET name = 'phill', 
    value = 'person', 
    id = 12345; 
+0

是的,我瞭解功能,但我的用戶只能訪問SELECT,INSERT,UPDATE。但是我試圖遠離UPDATE,並且我不知道我是否具有REPLACE功能的許可權 – 2010-02-08 17:22:28

+2

嘗試INSERT IGNORE – Yada 2010-02-08 17:24:42

+0

INSERT IGNORE是否刪除並再次添加記錄?或者它只是如果找到並跳過它,如果找不到,插入? – 2010-02-08 19:17:54

2

如果從具有子查詢的select查詢執行插入操作,以便只在該行尚不存在時才返回行,那麼該怎麼辦?

僞代碼:

INSERT INTO TABLE_FOO (...) 
SELECT @VAR1, VAR2 ... 
FROM DUMMYTABLE -- THIS TABLE SHOULD CONTAIN 1 RECORD OF ANYTHING 
       -- IN CASE THE FROM IS REQUIRED 
WHERE (SELECT COUNT(*) FROM TABLE_FOO WHERE COLUMN1 = @VAR1) = 0 

這種模式應該工作,你只需要得到正確的語法爲MySQL。

+2

當處理不使用鍵或唯一鍵的行時,這非常有用。 – zigg 2013-02-11 17:31:52