Kev*_*ith 2 sql postgresql referential-integrity foreign-keys
所以我有两张桌子:
Bookmarks 有几列[id等]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脚本.
@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.取消注释最后一行以摆脱死人.
| 归档时间: |
|
| 查看次数: |
823 次 |
| 最近记录: |