database - 如何在另一个表的 ID 中的 Postregsql 实体表中插入自动生成的 ID
问题描述
我有一个实体表,我想从中自动生成数据以在其他表中用作 FK。生成的 Id 将成为其他表中的 PK。
我的桌子
带有user_Id (PK) 的用户表,以及其他列,例如firstname、lastname、email、password等。
条目表是具有一个entry_Id (PK) 列的实体表。
Article表将使用上面Entry表中自动生成的entry_Id作为 PK 与其他列,例如title,authorId,category,created_Date。
照片表将使用上面Entry表中自动生成的entry_Id作为 PK 与其他列,如title、imageurl、authorId (FK)、created_Date。
评论表将使用comment_Id作为PK,将上面Entry表中自动生成的entry_Id作为FK,形成一个复合键。其他列包括来自Users表的user_Id作为 FK 、 comment、created_Date。
Flag表会使用flag_Id作为 PK,上面的Entry表中自动生成的entry_Id作为 FK,形成一个复合键。其他列包括来自用户表flag_type的user_Id作为 FK 。
我想做的事
我希望我的查询在有人提交表单时自动生成entry_Id并在其他表(例如Article、Photo、Comment和Flag )中自动使用生成的 id 。
当我对这些值进行硬编码时,Article和Photo表接受一个entry_Id用于多行。
我看到了这样的东西,但我不确定这是否是我想要的。
START TRANSACTION;
INSERT INTO foo (auto,text)
VALUES(NULL,'text');
INSERT INTO foo2 (id,text)
VALUES(LAST_INSERT_ID(),'text');
COMMIT TRANSACTION;
是否有一个脚本可用于使我的实体表中的自动生成的 id 可在其他表中重复使用?
解决方案
正如 wildplasser 所评论的,自 9.1 版以来,Postgres 有一个很好的特性,它结合了 cte 和returning
关键字,它允许你做你想做的事。
这是基于您的伪代码的示例:
with foo_row as (insert into foo (text) values ('text') returning foo_id)
insert into foo2 (foo_id) select foo_id from foo_row
推荐阅读
- gitlab - 如何读取 CICD 预定义变量
- java - 响应标头的差异 - 正常服务与通过 Jetties 反向 ProxyServlet
- javascript - 限制 HTML5 文本区域中的行数
- angular - 绑定响应中的值并使用 angular2 使用这些值制作复选框
- node.js - MongoDB父/子关系和快速检索父母
- python - 自动化无聊的东西 - 逗号代码:为什么我的代码不起作用?
- selenium - Selenium 有时无法识别元素
- jenkins - Jenkins 测试电子邮件工作正常,但在构建运行后发送电子邮件时出错
- python-3.x - --headless 不是 chrome webdriver for selenium python 中的一个选项
- python - 在python中将字符串转换为元组