2013-07-24 144 views
2

在我的數據庫中,我有tickets_users附屬於用戶的票。如果該值不存在,則插入

我願意做一個INSERT,在tickets_users檢查是否存在尚未這個users_id(例如用戶1444)和type = 2 WHERE tickets_id = something(例如准考證號455);如果它已經存在什麼也不做,否則

INSERT INTO tickets_users (tickets_id, users_id, type) VALUES (455, 1444, 2) 
WHERE tickets_id = 455 
+1

想[這](http://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists)可能是你在找什麼? – vanamerongen

+0

[替換](http://dev.mysql.com/doc/refman/5.0/en/replace.html)?但有一點需要注意,它與Oracle中的MERGE不同。這是'INSERT's或'DELETE's'' INSERT's。 –

+0

自動增量中的tickets_users.id,如果類型,tickets_id和users_id匹配,我不想刪除舊的,只是不做任何事情,只有在不匹配時纔會插入 – Mokkun

回答

3
INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = something) 

試試這個

編輯:
要添加多行

INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 455) 
union all 
select 456, 1444, 2 from dual 
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 456) 
+0

感謝您的請求似乎工作,但如何將此請求用於多個INSERT?例如使用SELECT 455,1444,2 WHERE tickets_id = 455,但也選擇425,1226,2 WHERE tickets_id = 425 etc ... – Mokkun

+0

您可以使用聯合所有 – Akhil

+0

請您編輯您的答案,告訴我如何查詢聯盟看所有讓2票? – Mokkun

4

您可以使用一個PRIMARY KEY或UNIQUE索引包含適當字段的表格以停止重複記錄。

PRIMARY KEY 

使用INSERT IGNORE而不是INSERT。如果一條記錄沒有複製現有的記錄,MySQL會照常插入它。如果記錄是重複的,那麼IGNORE關鍵字告訴MySQL放棄它而不會產生錯誤。

INSERT IGNORE 

對於實施例:所述ID被假定爲是主鍵。如果表'tablename'中的記錄已經有id = 1的記錄,那麼查詢將被忽略而不是產生警告。

注意:僅在開發階段使用IGNORE關鍵字。它可能會導致意外的結果,因爲您無法確定記錄是否已插入。

+0

剛剛嘗試過'INSERT IGNORE INTO tickets_users(tickets_id,users_id,type,use_notification)VALUES(1,1444,2,1)',它仍然添加它,我做錯了什麼? – Mokkun

+0

r將列鍵添加到列 –

+0

我不認爲'INSERT IGNORE'是推薦的用法。它會忽略所有類型的錯誤,即使它應該被捕獲爲不正確的格式等。[見此](http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-更新) – Akhil

相關問題