0

ヒューマンエラーが原因で、リレーションのrelation_idがデータベースに表示されることがありますが、これに対する実際のIDがありません。

SELECT relation_id
FROM relations
WHERE relation_id NOT 
IN (
    SELECT id
    FROM relations
)

これにより、これが発生したフィールドが返されます。relation_idの値をNULLに切り替えたいと思います。

これが私がこれまでに得たものです:

UPDATE `relations` SET relation_id = NULL WHERE relation_id NOT IN (SELECT id FROM relations)

このオフコースは、リレーションではなく、他のテーブルで機能します。誰かが回避策を知っていますか?方法があると確信しています

4

3 に答える 3

3

エラーの理由は、実際にはエラーメッセージ自体に詳しく説明されています...内部SELECTで更新するテーブルを指定することはできません。しかし、誰が私たちがこれ以上深くなることはできないと言ったのでしょうか?

UPDATE relations 
   SET relation_id = NULL 
 WHERE relation_id NOT IN (
       SELECT id FROM (SELECT id FROM relations) AS take_that_sql
);

これが試してみるSQLFiddleです。)。

于 2012-06-21T15:24:10.000 に答える
1

これは私が試すものです:

UPDATE relations r
  LEFT JOIN relations s 
    ON r.relation_id = s.id
   SET r.relation_id = NULL 
 WHERE s.id IS NULL
   AND r.relation_id IS NOT NULL;

(それが機能するかどうかはわかりません。関係テーブルが 2 回参照されるため、例外が発生する可能性があります。)

複数テーブルの更新が機能しない場合は、作業テーブルを作成し、作業テーブルに (更新する行を識別する) クエリを入力してから、作業テーブルを使用して複数テーブルの更新を実行します。

このクエリはrelation_id、既存の を指していないを持つ行を識別しidます。

SELECT r.*
  FROM relations r
  LEFT JOIN relations s 
    ON r.relation_id = s.id
 WHERE s.id IS NULL
  AND r.relation_id IS NOT NULL;

すべての列を取得する必要はなく、主キーのみを取得します。(ここでは、主キーが単一の列であると想定していますid。)

CREATE TABLE work_table (id int PRIMARY KEY);

INSERT INTO work_table (id)
SELECT r.id
  FROM relations r
  LEFT JOIN relations s 
    ON r.relation_id = s.id
 WHERE s.id IS NULL
   AND r.relation_id IS NOT NULL;

UPDATE relations r
  JOIN work_table s
    ON r.id = s.id
   SET r.relation_id = NULL;

DROP TABLE work_table;

補遺:

InnoDB を使用している場合は、外部キー制約を定義することで、将来このタイプのデータ整合性の問題を回避できます。例えば:

ALTER TABLE relations ADD CONSTRAINT relations_FK
FOREIGN KEY (relation_id) REFERENCES relations(id)
ON UPDATE CASCADE ON DELETE SET NULL;

relation_idこれにより、 がテーブルに存在する値以外の値を持つ結果となるテーブルへの変更が禁止されidます。(これにidは PRIMARY KEY が必要であり、relation_id のデータ型が同じである必要があります。)

于 2012-06-21T15:21:10.550 に答える
0

これを試して ::

SELECT r1.relation_id
FROM relations r1
left join relations r2 on (r1.relation_id=r2.id)
where r2.id is null
于 2012-06-21T15:07:52.587 に答える