考虑两个具有多对多关系的表:
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
答案 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)
您将无法同时更新和删除单个查询中的记录。您可以使用交易: