Mysql 在不违反原始约束的情况下更新多对多关系表
考虑两个具有多对多关系的表:Mysql 在不违反原始约束的情况下更新多对多关系表,mysql,sql,Mysql,Sql,考虑两个具有多对多关系的表: Company Speciality --------- --------- id id --------- --------- 1 21 2 22 3 23 4 CompanySpeciality -------------------------- company_id | spec
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,其中company_id=4”,那么我将面临主要矛盾冲突,因为对1 | 21已经存在
这是一种使用单个查询更新关系表的方法吗?此查询应仅影响不会重复的行
结果将是:
CompanySpeciality
--------------------------
company_id | speciality_id
--------------------------
1 | 21
1 | 22
1 | 23
您不想
更新
,您想:
您不想
更新
,您想:
大意是:
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);
应该对你有用。(我还没有测试确切的语法,但是使用notexists
子句应该可以帮助您消除违反主键约束的问题)
然后,您必须在单独的查询中删除表中为company 4保留的额外记录:
DELETE FROM CompanySpecialty
WHERE company_id=4;
大意是:
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);
应该对你有用。(我还没有测试确切的语法,但是使用notexists
子句应该可以帮助您消除违反主键约束的问题)
然后,您必须在单独的查询中删除表中为company 4保留的额外记录:
DELETE FROM CompanySpecialty
WHERE company_id=4;
您将无法在一个查询中同时更新和删除记录。您可以使用以下事务:
您无法在一次查询中同时更新和删除记录。您可以使用以下事务:
因为4号公司与1号公司的专长并不总是相同的。我想将company_1和company_4中的专业合并到company_1中,然后删除company_4好的,我已经稍微更新了您的示例以使其更清晰。。。你能再核对一下吗?是的,谢谢。我为预期结果添加了一个示例。请注意,如果“有问题的”对4 | 21保留在表中,这不是问题,我可以运行清理任务来删除孤立项。因为公司4并不总是具有与公司1相同的特性。我想将company_1和company_4中的专业合并到company_1中,然后删除company_4好的,我已经稍微更新了您的示例以使其更清晰。。。你能再核对一下吗?是的,谢谢。我为预期结果添加了一个示例。请注意,如果“有问题的”对4 | 21保留在表中,这不是问题,我可以运行清理任务来删除孤立项。这不会起作用。您需要更改您选择的公司id。。。为了选择1,我以前从未使用过“insert-ingnore”语句。这看起来很有趣,但正如galchen所说,我认为你遗漏了问题的一部分不?关于键“1”没有什么?只是提醒一句:使用
INSERT IGNORE
时,请确保数据类型正确。如果您试图用此语句输入与字段数据类型不匹配的内容,则不会失败。它只是将您的输入转换为“最接近的值”(见上面的链接),这可能不是您想要的。有时候你可能更喜欢错误而不是猜测,这是行不通的。您需要更改您选择的公司id。。。为了选择1,我以前从未使用过“insert-ingnore”语句。这看起来很有趣,但正如galchen所说,我认为你遗漏了问题的一部分不?关于键“1”没有什么?只是提醒一句:使用INSERT IGNORE
时,请确保数据类型正确。如果您试图用此语句输入与字段数据类型不匹配的内容,则不会失败。它只是将您的输入转换为“最接近的值”(见上面的链接),这可能不是您想要的。有时候你可能更喜欢错误而不是猜测。谢谢,我会尽快尝试:)谢谢,我会尽快尝试:)