2013-06-20 107 views
0

如果product_id的ip_address不存在,但最好不要創建兩個單獨的查詢,那麼我想插入同一個表中。我怎樣才能實現它?MySQL INSERT INTO WHERE NOT EXIST

將在下面的示例表:

id | product_id | ip_address | 
------------------------------ 
a 11112  8.8.8.8 
b 11234  9.9.9.9 

和我的代碼是這樣的,但它不工作。

INSERT INTO `'._DB_PREFIX_.'views` 
(SELECT '.$id_product.',"'.$ip_addr.'" 
FROM `'._DB_PREFIX_.'views` 
WHERE NOT EXISTS (SELECT * FROM 
`'._DB_PREFIX_.'views` v WHERE v.id_product ='.$id_product.' AND 
t.ip_address ="'.$ip_addr.'" 
))' 
+0

您能告訴我們您當前的查詢嗎? – Duikboot

+0

可能的重複[如何在MySQL中插入'如果不存在'](http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql) – RandomSeed

回答

9

您可以使用INSERT IGNOREREPLACEINSERT ... ON DUPLICATE KEY UPDATE ...

每個需要你有上的product_id唯一約束,IP_ADDRESS

INSERT忽略

INSERT IGNORE INTO products VALUES (null, 111, '8.8.8.8') 

將忽略插入,如果條目已經存在。

更換

REPLACE INTO products VALUES (null, 111, '8.8.8.8') 

將執行刪除加上一個新的插入。

INSERT ... UPDATE

INSERT INTO products VALUES (null, 111, '8.8.8.8') 
ON DUPLICATE KEY UPDATE products SET last_modified = NOW() 

會嘗試插入,如果失敗更新現有記錄。

在你的情況下,我認爲你應該罰款INSERT IGNORE,但是如果你想改變其他值,如果記錄已經存在,INSERT ... UPDATE ...應該很好。

我一般不建議使用REPLACE,除非你真的想要一個DELETE FROM table WHERE ...INSERT INTO TABLE ...

更新

這需要(在這個例子中)的組合產品的唯一索引,IP_ADDRESS。 您可以通過

ALTER TABLE products 
ADD UNIQUE INDEX `UIDX_PRODUCT__IP_ADRESS`(product, ipaddress); 
+0

嗨,你好嗎?答案是我正在看的東西,但有可能ip_address重複多次,但在不同的產品ID。我怎樣才能做到這一點? –

+1

您可以爲組合產品/ ip_address提供唯一索引,這允許您將ip_address分配給多個產品,但確保不能爲產品插入兩次相同的ip_address。我添加了聲明來修改你的表格到我的答案 –

+0

嗨,再次,這是完美的。還有一個想法,我使用INSERT IGNORE,當插入的product_id和ip_address忽略,但id本身增加1。這是正常行爲嗎? –