sql - 将伪代码转换为 SQL 脚本

标签 sql postgresql foreign-keys referential-integrity

所以我有两个表:

  1. Bookmarks 有几列[id, etc.]
  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
>     }
> }

请告诉我如何转换为 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 中的值。

  • 当您更改 bookmarks.id< 中的条目时,
  • ON UPDATE CASCADE 会更改 person_bookmarks.bookmarkid 中相应的/

  • ON DELETE CASCADE 会在您更改 bookmarks.id 中的条目时删除 person_bookmarks.bookmarkid 中的相应 .

其他选项可用,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/

相关文章:

android - 如何从 SQLite 中检索最后一个 _ID

sql - 如何对sql查询中的数据进行汇总

postgresql - 使用 md5 加密密码而非明文密码登录 PostgreSQL

hibernate - 如何为热/暖备用 Postgresql 服务器配置 c3p0?

mysql - 更改表和外键错误

mysql - Laravel 外键约束迁移错误

mysql 使用选择查询中的列更新整个列

sql - 在 SQL Azure 和多个本地 SQL Server 数据库之间实现数据同步的最佳方法是什么?

sql - 使用 psql 复制 csv 时包括 NULL 值

postgresql - PL/pgSQL - 插入多行,返回结果集中的 ID