gpt4 book ai didi

mysql - 使用 liquibase 使用序列的数据库不可知示例

转载 作者:行者123 更新时间:2023-11-28 23:19:33 24 4
gpt4 key购买 nike

在探索使用序列与 AUTO-INCREMENT 的细微差别时,我正在努力寻找一个真实的例子来说明如何制作与数据库无关的 liquibase 项目。

场景要求:

创建一个包含一些列的表,在 PKID 的值是某个计算值的地方插入数据

我的起点是一个现有的 postgres 数据库,它引用了 changeSet 中的一个 .sql 文件。创建序列:

<sqlFile path="create-tables.sql" relativeToChangelogFile="true"/>

来自 create-tables.sql 的 SQL

CREATE TABLE new_table (
pkid integer NOT NULL,
);

CREATE SEQUENCE new_table_pkid_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

有一个changeSet可以根据顺序插入记录,如下:

<changeSet author="yoman" id="123">
<insert tableName="new_table">
<column name="pkid" valueComputed="nextval('new_table_pkid_seq')"/>
</insert>
</changeSet>

但是,MySQL 不支持序列。 Oracle 还以不同的语法使用序列。

所以我不知道如何制定适用于所有三个的解决方案?

我的想法是

  1. 放弃使用序列和/或函数,并为所有 3 个数据库使用 AUTO-INCREMENT。然后删除 create-tables.sql 并使用 liquibase XML 创建表 changeSet语法。

  2. 在 postgres 中创建一个函数而不是序列,并在 Oracle 和 MySQL 中创建同名函数,模拟序列函数。然后指定函数名:

<column name="pkid" valueComputed="INCREMENT_FUNCTION()"/>

问题..

  1. 问题是,如果我尝试 #1,我不知道 XML 会是什么样子(例如,我是否使用 dbms?)?此外,序列提供了更大的灵 active ,因此不确定其他贡献者是否同意使用 AUTO-INCREMENT。

  2. 不确定如何在 liquibase 中为这 3 个目标主机实际生成通用函数。

据我所知,liquibase 是一种插入数据库不可知设置概念的工具。但是我找不到有关如何创建适用于多个数据库目标的 liquibase 项目的一些基本示例的任何文档。

最佳答案

选项:

  1. Oracle 12c 支持 AUTO_INCREMENT,因此这是一个选项。

  2. 不要试图成为数据库不可知论者。过去我见过许多公司尝试构建与数据库无关的应用程序。问题是您最终会做出妥协,并且最终会得到可以在任何地方运行的糟糕应用程序。这些公司中的大多数现在都倒闭了

  3. 有 CODE_CONTROL 表的概念;但这是一个糟糕的选择,我什至不打算解释它!

关于mysql - 使用 liquibase 使用序列的数据库不可知示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com