插入引用另一个表而不对外键值进行硬编码的测试数据

时间:2017-12-06 14:58:21

标签: sql postgresql sqlite

我正在尝试编写一个SQL查询,将测试数据插入到两个表中,其中一个表引用另一个表。

表格由以下内容创建:

CREATE TABLE address (
  address_id INTEGER IDENTITY PRIMARY KEY,
  ...[irrelevant columns]
);

CREATE TABLE member (
  ...[irrelevant columns],
  address INTEGER,
  FOREIGN KEY(address) REFERENCES address(address_id)
);

我希望两个表中的id都能自动递增,这样我以后就可以轻松插入新行,而无需查看表中的id。

我需要在两个表中插入一些测试数据,每个表大约25行。插入的硬编码ID会导致以后插入新行时出现问题,因为id列的自动值尝试以1开头(已经在数据库中)。所以我需要让id自动生成,但我还需要知道数据库中有哪些id用于将测试数据插入到成员数据库中 - 我不相信自动生成的那些是连续的,所以不能假设我可以安全地硬编码那些。

这是测试数据 - 我不关心我将哪个记录链接到我要插入的每个成员行,只是说地址表中有一个带有该ID的地址记录。

到目前为止,我对如何做到这一点的想法包括:

  1. 单独插入地址,返回id,然后使用它来插入单个成员(缺点:可能很乱,不确定语法,更难看到测试数据中预期的地址/成员集)
  2. 成员插入SELECT address_id FROM address WHERE [some condition that will only give one row]作为地址栏(缺点:也有点乱,涉及一个很长的陈述,我不关心的事情)
  3. 这个问题有更简洁的方法吗?

    我特别想知道是否有办法:

    • 让自动增量控制功能知道手动插入的id值,或
    • 从地址表中获取插入的id列表到变量中,我可以使用值来插入成员。

    理想情况下,我希望这可以与尽可能多的(令人烦恼的略有不同)数据库引擎一起使用,但我需要至少支持postgresql和sqlite - 理想情况下在一个查询中,尽管我可以有两个单独的查询。 (我有单独的用于创建表格,唯一的区别是INTEGER GENEREATED BY DEFAULT AS IDENTITY而不仅仅是IDENTITY。)

1 个答案:

答案 0 :(得分:0)

https://www.postgresql.org/docs/8.1/static/functions-sequence.html

听起来LASTVAL()就是您正在寻找的内容。在现实世界中,还可以在多个选择之间保持事务一致性,因为它的范围限定在上次插入的会话中。