14

liquibase を使用して「順序付きインデックス」を作成する一般的な方法があるかどうか疑問に思っています。これらの種類の SQL ステートメントを生成するもの:

CREATE INDEX idx_name ON my_table (m_column DESC)

Oracle、postgresql、mysql、および sql サーバーに必要です。

SQLそうでない場合は、各 RDBM のタグを使用して手動で行う必要があります。

4

4 に答える 4

3

Liquibase のソース コードを調べたところ、インデックスの列順序の処理が見つかりませんでした。したがってsql、 andmodifySqlブロックを使用することをお勧めします (ほとんどの DBMS は に対して同じ構文を持っているとcreate index思いますので、おそらく は必要ありませんmodifySql)。

<changeSet id="1">
    <sql>
<![CDATA[
CREATE INDEX idx_name ON my_table (m_column DESC)
]]>
    </sql>
    <!-- just for example -->
    <modifySql dbms="mssql">
        <replace replace="CREATE INDEX" with="CREATE NONCLUSTERED INDEX"/>
    </modifySql>
</changeSet>
于 2012-11-04T08:59:15.960 に答える
3

Liquibase を活用し、さまざまな RDBMS をサポートするには、@Vadzim によって指摘されているように、https: //liquibase.jira.com/browse/CORE-419 が修正されるまでcreateIndex、使用する必要があります。modifySql

Oracle と PostgreSQL の場合、構文は単純です (PostgreSQL が「常に列名を引用する」モードで使用されている場合を除く)。

<modifySql>
    <replace replace="COL1NAME" with="COL1NAME ASC"/>
    <replace replace="COL2NAME" with="COL2NAME DESC"/>
</modifySql>

ただし、これは SQL Server では機能しません。Liquibase[...]は SQL Server で列名をラップするため、次のようなものが必要になります。

<modifySql>
    <regExpReplace replace="\bCOL1NAME\b[^,) ]*" with="$0 ASC" />
    <regExpReplace replace="\bCOL2NAME\b[^,) ]*" with="$0 DESC" />
</modifySql>

(Oracle、postgresql、SQL サーバー、および h2 でテスト済み)

ただし、上記は見た目と同じくらい醜いです。simple を使用<sql>すると、より読みやすい結果が得られると思います。正直なところ、移植性が低下しているようには見えません。

于 2015-02-10T22:01:43.360 に答える
1

https://liquibase.jira.com/browse/CORE-419には、liquibase インデックスの順序付けに関する未解決の機能リクエストがまだあります。

考えられる回避策の 1 つ (1.9 以降):

<createIndex tableName="my_table" indexName="my_index">
    <column name="COL1NAME"/>
    <column name="COL2NAME"/>
</createIndex>
<modifySql>
    <replace replace="COL1NAME" with="COL1NAME ASC"/>
    <replace replace="COL2NAME" with="COL2NAME DESC"/>
</modifySql>

liquibase 3.2 で検証が強化されるまで、さらに短い回避策が利用可能であったことに注意してください。

<createIndex tableName="my_table" indexName="my_index">
    <column name="registration_time DESC"/>
    <column name="id ASC"/>
</createIndex>
于 2015-02-09T18:09:20.577 に答える