2011-09-18 95 views
1

我有以下表結構:使兩列有一個唯一的關鍵,但只有當兩個匹配?

OFFER_ID -|- COUNTRY -|- URL 
    1  -|- GB -|- http://www.example.com/1 
    1  -|- US -|- http://www.example.com/2 
    1  -|- FR -|- http://www.example.com/3 

我要的是更新URLBOTHOFFER_IDGB表中已經存在。

例如,如果搜索條件是:

INSERT INTO table_name (offer_id, country, url) VALUES ('1','DE', 'http://www.example.com/3')

OR

INSERT INTO table_name (offer_id, country, url) VALUES ('2','FR', 'http://www.example.com/4')

一個新行會被插入作爲雖然OFFER_ID的值(在實施例。2)和COUNTRY(在例1中)是新的,值爲COUNTRY(在前。 2)和OFFER_ID(在例1中)不是。

然而,這樣的查詢:

INSERT INTO table_name (offer_id, country, url) VALUES ('1','FR', 'http://www.example.com/7')

URL列將被更新。

我知道使用ON DUPLICATE KEY UPDATE url=VALUES(url)將是未來的方向,但如何將能夠構建這樣只有當兩個OFFER_IDCOUNTRY不是唯一的,作爲反對新行被插入的URL列被更新?

任何幫助將不勝感激:)!

回答

0

可以使雙方一個主鍵

PRIMARY KEY (`offer_id`, `country`) 
+0

輝煌。正是我在找什麼! – Avicinnian

0

您只需將該表的主鍵設置爲(OFFER_ID,COUNTRY)即可。 (或者該列對設置UNIQUE約束。)

+0

要清楚它並不一定是*主鍵* – zerkms

+0

它聽起來像它會是一個非常正確的使用主鍵雖然。 – Mat

+0

是的,但我的想法是關於指出,它可以只是一個複合獨特的關鍵要麼。順便說一句,如果OP使用innodb作爲存儲引擎,那麼使用不會單調增長的東西作爲PK是一個壞主意。 – zerkms

1

的一部分創建的(OFFER_ID,COUNTRY)唯一索引,並ON DUPLICATE KEY UPDATE將工作:

ALTER TABLE foo 
ADD UNIQUE INDEX offer_id_country (OFFER_ID, COUNTRY); 

或者一個主鍵,如果你沒有一個已經:

ALTER TABLE foo 
ADD PRIMARY KEY (OFFER_ID, COUNTRY); 
+0

謝謝:)。爲什麼'offer_id_country'連接字符串,這是什麼意思? – Avicinnian

+0

@Pixelatron:它是索引的名稱。你可以指定你喜歡的任何名字,而'offer_id_country'則反映'offer_id'和'country'都包含在這個特定的名稱中。 – zerkms

+0

@zerkms - 我猜我混淆了'UNIQUE KEY'和'UNIQUE INDEX'。 – Avicinnian

0

嘗試使用Mysql的REPLACE函數。在(OFFER_ID,COUNTRY)上創建唯一密鑰後。

REPLACE INTO table_name (offer_id, country, url) VALUES ('1','FR', 'http://www.example.com/7') 
+0

'重複密鑰更新'不會在相同的情況下工作,還是基本上做同樣的事情,但開銷較少? – Avicinnian

+0

我想它會,但是用REPLACE,不需要改變表格的結構 – Tom

相關問題