使两列有一个唯一的关键,但只有当两个匹配?

问题描述:

我有以下表结构:使两列有一个唯一的关键,但只有当两个匹配?

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列被更新?

任何帮助将不胜感激:)!

可以使双方一个主键

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

辉煌。正是我在找什么! – Avicinnian

您只需将该表的主键设置为(OFFER_ID,COUNTRY)即可。 (或者该列对设置UNIQUE约束。)

+0

要清楚它并不一定是*主键* – zerkms

+0

它听起来像它会是一个非常正确的使用主键虽然。 – Mat

+0

是的,但我的想法是关于指出,它可以只是一个复合独特的关键要么。顺便说一句,如果OP使用innodb作为存储引擎,那么使用不会单调增长的东西作为PK是一个坏主意。 – zerkms

的一部分创建的(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

尝试使用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