0

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

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
4

3 回答 3

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;
于 2013-01-29T15:59:23.547 回答
1

你不想UPDATE,你想INSERT忽略欺骗

INSERT IGNORE INTO CompanySpeciality (company_id, speciality_id)
SELECT 1, speciality_id
FROM CompanySpeciality
WHERE company_id=4
于 2013-01-29T15:57:14.827 回答
0

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

mysql:一次查询中选择、插入、删除和更新

于 2013-01-29T16:00:53.473 回答