所以我有两张桌子:
Bookmarks有几列[id等]
Person_Bookmark有两列[拟人,bookmarkId]
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脚本。

最佳答案

@简已经提到了外键,但他的建议是不完整的。
似乎你想删除所有不存在的书签的关联。
以以下形式定义aforeign key constraint

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.bookmarkid中的条目时,会更改bookmarks.id中的相应值
ON DELETE CASCADE更改person_bookmarks.bookmarkid中的条目时,删除bookmarks.id中的相应行。
其他选项可用,read the manual.
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的行。取消最后一行的注释,以便清除死人。

09-07 15:01