2017-02-23 35 views
0

在探索使用序列與AUTO-INCREMENT的細微差別我努力尋找一個如何製作數據庫不可知論liquibase項目的實際例子。使用liquibase使用序列的數據庫不可知例子

方案要求:

一些列創建一個表,插入數據,其中PKID的價值,是一些計算值

我的出發點是現有的Postgres數據庫,在引用的.sql文件在changeSet創建一個序列:由創造tables.sql

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

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 author="yoman" id="123"> 
    <insert tableName="new_table"> 
     <column name="pkid" valueComputed="nextval('new_table_pkid_seq')"/> 
    </insert> 
</changeSet> 

然而,MySQL不支持序列。 Oracle還使用不同語法的序列。

所以我不知道如何制定一個解決方案,將爲所有三個工作?

我的想法是

  1. 刪除使用序列和/或功能,並使用自動增量所有3分貝的。然後刪除create-tables.sql並使用liquibase XML changeSet語法創建表。

  2. 在postgres中創建一個函數而不是序列,並在Oracle和MySQL中創建相同的名稱函數,以模擬序列函數。然後指定函數名稱:

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

問題..

  1. 問題是我不知道XML是什麼樣子,如果我試圖#1(我做例如使用dbms?)?另外,序列提供了更多的靈活性,因此不確定其他貢獻者會同意使用AUTO-INCREMENT。

  2. 不知道如何實際爲這3個目標主機在liquibase中生成一個通用函數。

據我所知,liquibase是一個驅動數據庫不可知性設置概念的工具。但是我找不到任何關於如何創建一個可以針對多個數據庫目標的liquibase項目的基本示例的文檔。

回答

0

選項:

  1. 甲骨文12C支持AUTO_INCREMENT,所以這是一個選項。

  2. 不要試圖成爲數據庫不可知論者。過去我看到許多公司試圖構建數據庫不可知的應用程序。問題在於,最終會導致妥協,並且最終導致應用程序不暢,可能無處不在。這些公司中的大多數現在已經停業

  3. 有一個CODE_CONTROL表的概念;但這是一個糟糕的選擇,我甚至不會解釋它!

相關問題