0

多対多の関係を持つ2つのテーブルを検討します。

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

1回のクエリでレコードの更新と削除の両方を行うことはできません。トランザクションを使用できます。

mysql:1つのクエリで選択、挿入、削除、更新

于 2013-01-29T16:00:53.473 に答える