在不违反主要约束的情况下更新多对多关系表

时间:2013-01-29 15:45:28

标签: mysql sql

考虑两个具有多对多关系的表:

Company           Speciality
---------         ---------
id                id
---------         ---------
1                 21
2                 22
3                 23
4


CompanySpeciality
--------------------------
company_id | speciality_id
--------------------------
1          | 21
1          | 22
4          | 21
4          | 23

我想删除公司4,并将其专业与公司关联1。 如果我在CompanySpeciality上使用简单的UPDATE语句来设置“company_id = 1 WHERE company_id = 4”,那么我面临主要的约束违规,因为对1 | 21已经存在。

是一种用单个查询更新关系表的方法吗?此查询应仅影响不会重复的行。

结果将是:

CompanySpeciality
--------------------------
company_id | speciality_id
--------------------------
1          | 21
1          | 22
1          | 23

3 个答案:

答案 0 :(得分:2)

产生影响的东西:

UPDATE CompanySpecialty
SET company_id=1
WHERE company_id=4
AND NOT EXISTS (SELECT * FROM CompanySpecialty cs WHERE cs.company_id=1 AND cs.specialty_id=CompanySpecialty.specialty_id);

应该适合你。 (我没有测试确切的语法,但使用NOT EXISTS子句可以帮助您消除违反主键限制的问题。)

然后,您必须在单独的查询中删除公司4表格中剩余的额外记录:

DELETE FROM CompanySpecialty
WHERE company_id=4;

答案 1 :(得分:1)

您不希望UPDATE,想要INSERT and ignore dupes

INSERT IGNORE INTO CompanySpeciality (company_id, speciality_id)
SELECT 1, speciality_id
FROM CompanySpeciality
WHERE company_id=4

答案 2 :(得分:0)

您将无法同时更新和删除单个查询中的记录。您可以使用交易:

mysql: select, insert, delete and update in one query