【问题标题】:How to reference the auto incremented id when performing a second insert in Liquibase?在 Liquibase 中执行第二次插入时如何引用自动递增的 id?
【发布时间】:2015-11-02 09:06:52
【问题描述】:

我目前正在使用 Liquibase,并为用户和角色创建了一个表。每个用户都有一个唯一的 ID,该 ID 在插入用户时自动生成(通过自动递增序列)。然后,角色表中的角色将引用此 id。

现在我尝试使用 Liquibase 插入默认用户。首先我插入用户,然后我想插入一个引用这个新创建的用户的角色。

问题是我在 Liquibase 中找不到方法来检索为新用户生成的 id,以便在插入新角色时可以使用它。

这可能吗?如果是,应该怎么做?

想做以下事情:

<insert tableName="xxx_user">
    <!-- Id is auto incremented -->
    <column name="user_name" value="XXX" />
    <column name="password" value="XXX" />
    <column name="first_name" value="XXX" />
    <column name="last_name" value="XXX" />
</insert>

<insert tableName="user_role">
    <column name="user_id" value="<point at the auto generated id in previous insert>" />
    <column name="role" value="A_ROLE" />
</insert>

【问题讨论】:

  • 请向我们展示您的 Liquibase 变更集,但您很可能正在寻找 lastval()currval() - 或者您只需修改 CTE 的单个数据即可。
  • 这可以通过纯供应商特定的 SQL 轻松完成。但我尝试在 Liquibase 中使用 XML 来完成,并不特定于任何供应商。
  • 添加了我想做的 Liquibase 示例
  • 您可以尝试valueComputed="lastval()",但这将再次取决于供应商。我不认为 Liquibase 对这种事情有任何支持。不相关,但是:您真的有名为user 的表吗?这是个坏主意,因为user 是一个保留字,而requires to be quoted 是您每次使用时的保留字。

标签: sql database postgresql liquibase


【解决方案1】:

我使用 Mysql 数据库。这不是一个优雅的解决方案,但可以工作......

    <column name="user_id" valueComputed="(SELECT MAX(id) FROM xxx_user)"/>

【讨论】:

  • 欢迎来到 SO!请看How do I ask a good question?
  • 我认为这里的反对票是不值得的。这是迄今为止我找到的唯一成功的检索 ID 的方法。正如作者所指出的,这不是一个优雅的解决方案,但它确实弥补了查找自动生成 ID 的差距。
猜你喜欢
  • 2019-02-23
  • 2013-10-31
  • 1970-01-01
  • 2011-10-07
  • 2012-05-08
  • 2019-06-23
  • 1970-01-01
  • 2011-08-23
  • 2020-02-01
相关资源
最近更新 更多