2

だから私は2つのテーブルを持っています:

  1. Bookmarksいくつかの列 [id など] があります。
  2. Person_Bookmark[personId、bookmarkId] の 2 つの列があります。

Bookmarks他のウェブサイトへのリンクを表します。すべての有効なブックマークには ID があります。Person_Bookmarkテーブルには、 として示されている一連のとpersonIdsそのブックマークがありますbookmarkId

ここに私の疑似コードがあります:

> let x = integer list of all bookmarkId's from Person_Bookmark
> 
> for each x  {   
>     if ('select * from 'Bookmarks' where 'id' = x returns 0 rows) {
>       delete from 'person_bookmark' where 'bookmarkId' = x
>     }
> }

Postgres [編集] SQL スクリプトに変換する方法を教えてください。

4

3 に答える 3

5

@Jan はすでに外部キーについて言及しましたが、彼のアドバイスは不完全です。

存在しない(もう)ブックマークへのすべての関連付けを削除したいようです。次の形式で外部キー制約
を 定義します。

ALTER TABLE person_bookmarks
ADD CONSTRAINT pb_fk FOREIGN KEY (bookmarkid) REFERENCES bookmarks (id)
ON UPDATE CASCADE
ON DELETE CASCADE;
  • person_bookmarks.bookmarkidこれは、 に存在する の値のみを許可しますbookmarks.id

  • ON UPDATE CASCADEのエントリを変更すると、対応するが変更されますperson_bookmarks.bookmarkidbookmarks.id

  • ON DELETE CASCADEでエントリを変更すると、で対応するが削除されます。person_bookmarks.bookmarkidbookmarks.id

他のオプションも利用可能です。マニュアルをお読みください。

このON DELETE CASCADE句は、手動で修正しようとしているものを自動的に行います。fk 制約を追加する前に、一度手動で修正する必要があります。

DELETE FROM person_bookmarks pb
WHERE NOT EXISTS (SELECT 1 FROM bookmarks b WHERE b.id = pb.bookmarkid);
-- OR NOT EXISTS (SELECT 1 FROM persons p   WHERE p.id = pb.personid);

が存在しないすべての行を削除しますbookmarkid。最後の行もコメント解除して、死んだ人を取り除きます。

于 2012-11-17T11:19:57.557 に答える
2

これはSQL Serverで機能します-MySQLについてはわかりません...

delete pb
from
  person_bookmark pb
where not exists (select 1 from booksmarks b where b.id = pb.bookmarkid)
于 2012-11-17T04:10:03.457 に答える
0

@Derek の返信の別のバージョン:

DELETE FROM person_bookmark 
WHERE bookmarkid NOT IN (SELECT id FROM bookmarks)

これを行う必要があるということは、テーブル間に外部キー インデックスがないことを意味します。そうすることを強くお勧めします。欠点(または機能)は、たとえば a を削除するときperson(例からこのテーブルが存在すると推測しています)、関連するすべてのデータを最初に削除する必要があることです。そうしないと、サーバーがエラーをスローします。

このようなもの:

DELETE FROM person_Bookmark WHERE personid = @personid
DELETE FROM person_SomeOtherTable WHERE personid = @personid
DELETE FROM person WHERE id = @personid

ただし、利点は、データベースに孤立した行がなく、間違ったデータを誤って入力できないことです (存在しないabookmarkに対して aを保存します)。person

于 2012-11-17T04:29:38.177 に答える