2015-11-03 48 views
0

我有一个存储userSettings的表。这些设置是从具有默认值的设置表和用户表中生成的。如果用户设置了某些内容(或更改了默认值),我将userIndications表中的自定义值存储在settingID和UserID中。基于2个外键列插入或更新

我得到的感谢设置,从这个帮助,所以质疑Joining 3 MySQL tables in to 1 query

现在我想要做的是插入一条记录,如果它不存在,或者更新,如果它。

我知道我可以使用ON DUPLICATE KEY,但是我想测试两个外键的userID和settingID,而不是测试userSettings表的主自动增量ID userSettingID。如果有匹配更新,如果没有匹配插入。

用户最多可能有20个自定义设置,因此我无法在userID列上设置UNIQUE。

感谢

+0

'在dupe key'上可以使用** ANY **唯一密钥。它不一定是主键。所以如果你有'(userID,settingID)'作为唯一键,那么这足以触发更新。如果他们是外键也没关系。这些字段中的值仍然位于本地表中。他们只是有其他地方必须存在的额外财产。 –

+0

我尝试将UNIQUE添加到userID和settingID列,但由于userSettings表中有多个userID列,所以失败。 – puks1978

+0

“多个用户专栏”?咦?列名在表中是唯一的。你不能有2+名称相同的列。另一方面有多个记录......但是如果你有多个userid/settingid的副本,你如何判断这些设置值中的哪一个适用? –

回答

1

这是MySQL唯一的功能,但你可以使用REPLACE INTO,而不是INSERT INTO。如果您在多个字段(userID,settingsID)上添加了一个UNIQUE索引,则查询会自动按照您的要求进行。

[编辑]

从手册:

REPLACE作品酷似INSERT,不同之处在于,如果旧的行中的 表具有相同的值作为一个新的行为PRIMARY KEY或一个UNIQUE 索引,插入新行

前要添加一个索引到多个字段(来自How do I specify unique constraint for multiple columns in MySQL?)旧的行被删除:

ALTER TABLE `tbl` ADD UNIQUE `unique_index`(`userID`, `settingsID`); 
+0

我目前面临的问题是试图在用户ID列上添加UNIQUE,因为可能有多个用户ID的行,但只有一行包含userID和settingID组合。 – puks1978

+0

@ puks1978当然,userID和settingsID的组合是唯一的吗? – soulfreshner

+0

是的,组合只能存在一次。我试图将UNIQUE添加到每列,而不是多列。谢谢。 – puks1978