将伪代码转换为SQL脚本

Kev*_*ith 2 sql postgresql referential-integrity foreign-keys

所以我有两张桌子:

  1. Bookmarks 有几列[id等]
  2. 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
>     }
> }
Run Code Online (Sandbox Code Playgroud)

请告诉我如何转换为Postgres [edit] SQL脚本.

Erw*_*ter 5

@Jan 已经提到了外键,但他的建议不完整.

好像你想要删除不存在的书签的所有关联(任何更多).以下列形式
定义外键约束:

ALTER TABLE person_bookmarks
ADD CONSTRAINT pb_fk FOREIGN KEY (bookmarkid) REFERENCES bookmarks (id)
ON UPDATE CASCADE
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
  • 这只允许person_bookmarks.bookmarkid存在的值bookmarks.id.

  • ON UPDATE CASCADE相应的变化person_bookmarks.bookmarkid当您更改的条目bookmarks.id

  • ON DELETE CASCADE删除相应的person_bookmarks.bookmarkid,当您更改的条目bookmarks.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);
Run Code Online (Sandbox Code Playgroud)

删除不存在的所有行bookmarkid.取消注释最后一行以摆脱死人.