0

私の中級レベルの MySQL スキルにとってはかなり複雑なので、質問を特定できるかどうか見てみましょう。

問題:

DB テーブルの 1 つのデータを更新する必要があります。問題は、更新しているデータが複数の行に関連付けられていることです。

ID mailing_list_idsubscriber_id

9031 51 81053

9112 52 81053

13535 71 81053

mailing_list_id 52 を更新して名前を 51 に変更する必要がありますが、subscriber_id はすでに mailing_list_id が 51 であるため、更新中にそのレコードをスキップしたいと考えています。

以下を使用する場合:

UPDATE サブスクリプション SET mailing_list_id = 51 WHERE mailing_list_id = 52;

重複したエントリがあるというエラーが表示されます。

クエリの重複を無視する必要がありますが、クエリの書き方がわかりません。どんな助けでも大歓迎です。

サブスクライバー ID が既にメーリング リスト ID を持っている行をスキップするには、クエリに何かを追加する必要があります # 変更しようとしているものと同じです。それが理にかなっているのか、それともこの時点で私がとりとめのないものなのかはわかりません. やりたいことはわかっているのですが、それを実現するためのクエリ構文や方法がわかりません。

4

2 に答える 2

2

mailing_list_id にインデックス (一意またはプライマリ) があるのはどのフィールドですか? はいの場合、他の行に存在するデータを変更することはできません。

解決策は次のとおりです。 1. mailing_list_id フィールドの余分なキー (一意またはプライマリ) を削除します。2. または、新しいテーブルを作成してテーブルを削除し、テーブル サブスクリプションを削除した後、以下でクエリを実行して新しいテーブル サブスクリプションを作成します。

CREATE TABLE subscriptions (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     mailing_list_id INT(11),
     subscriber_id INT(11)
);
于 2013-01-23T22:31:34.673 に答える
0

これを永続的な解決策としてはお勧めしませんが、これによりエラーが取り除かれるため、より良いスキーマ(一意のキーREPLACE INTOなど)を計画している間に物事を機能させることができます.

UPDATE IGNORE subscriptions SET mailing_list_id = 51 WHERE mailing_list_id = 52;
于 2013-01-23T21:30:06.367 に答える