【问题标题】:Why and for what does one need the generatedKeys of a surrogate key of a Database?为什么以及为什么需要数据库代理键的生成键?
【发布时间】:2019-07-01 14:37:21
【问题描述】:

我有一个 Postgres 数据库,我正在编写一个 Java 程序来查询, 插入, 更新, 并从中删除数据。 我的一些表有代理键, 数据库自动递增。

我使用getGeneratedKeys() 方法来接收最后插入的元组的键。 但我不明白为什么我需要这些密钥以及如何处理它们?

我可以在不接收这些密钥的情况下插入数据。

// Works as expected and gives me the last key.
PreparedStatement prepStmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
....
ResultSet rs = prepStmt.getGeneratedKeys();
            if (rs.next()) {
                this.lastID = rs.getInt(1);
            }

这些生成的密钥的用途和/或价值是什么?

【问题讨论】:

  • 例如,您可能希望使用生成的密钥来执行其他操作,例如将记录插入另一个表。
  • 你的意思是作为另一个表中的外键?
  • 是的,这就是我的示例的意思,尽管可能还有其他示例说明您为什么要从 Java 获取生成的密钥。
  • 也许您想在 HTTP Location 标头中返回指向新资源的链接。
  • 即使没有任何其他表:假设客户端需要此生成的 ID 的值以便将其存储在某处并稍后获取行值。

标签: java sql postgresql jdbc


【解决方案1】:

如果您插入到超过 1 个具有另一个表的外键的表。

您需要将引用的键插入到第二个表的外键列中。

表A的id 表B的id外键

插入表B并在插入表A时使用相同的Id

【讨论】:

  • 例如,要存储包含三个行项目的发票,您首先编写发票(父)并捕获其生成的主键值。然后将三个行项目中的每一个写入行项目子表中,为每个新行项目行分配其父发票的标识符(其外键)。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多