Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在不违反原始约束的情况下更新多对多关系表_Mysql_Sql - Fatal编程技术网

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
时,请确保数据类型正确。如果您试图用此语句输入与字段数据类型不匹配的内容,则不会失败。它只是将您的输入转换为“最接近的值”(见上面的链接),这可能不是您想要的。有时候你可能更喜欢错误而不是猜测。谢谢,我会尽快尝试:)谢谢,我会尽快尝试:)