所以我有两个表:
Bookmarks
有几列[id, etc.]Person_Bookmark
有 2 列 [personId, 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 脚本。
最佳答案
@Jan 已经提到了外键,但他的建议是不完整的。
似乎您想删除与不存在(不再存在)的书签的所有关联。
定义一个 foreign key constraint形式为:
ALTER TABLE person_bookmarks
ADD CONSTRAINT pb_fk FOREIGN KEY (bookmarkid) REFERENCES bookmarks (id)
ON UPDATE CASCADE
ON DELETE CASCADE;
这仅允许存在于
bookmarks.id
中的person_bookmarks.bookmarkid
中的值。
当您更改 ON UPDATE CASCADE
会更改person_bookmarks.bookmarkid
中相应的值/ON DELETE CASCADE
会在您更改bookmarks.id
中的条目时删除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
的行。也取消注释最后一行以摆脱死人。
关于sql - 将伪代码转换为 SQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13427553/