所以我有两张桌子: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
的行。取消最后一行的注释,以便清除死人。