11

Liquibase には、列を一意として定義する方法が 2 つあります。

  1. テーブルを作成するとき<constraints>は、列で次を使用します。

    <createTable tableName="my_table">
        <column name="my_column">
            <constraints unique="true"
                         uniqueConstraintName="my_table_my_column_uk">
        </column>
    </createTable>
    
  2. テーブルを作成した後、次を使用し<createIndex>ます。

    <createTable tableName="my_table">
        <column name="my_column"/>
    </createTable>
    <createIndex tableName="my_table" unique="true"
                 indexName="my_table_my_column_uk">
        <column name="my_column"/>
    </createIndex>
    

単一列の一意のキーに対するこれら 2 つのアプローチに違いはありますか?

MySQL に関する私自身の観察では、違いはないようです。両方の宣言 (上記) は同じSHOW CREATE TABLE結果をもたらします。

...
UNIQUE_KEY `my_table_my_column_uk` (`my_column`)
...

しかし、これはすべてのデータベース実装に当てはまるのでしょうか?それとも、データベースごとに<createIndex unique="true">異なるスキーマ出力を生成する<constraint unique="true"/>のでしょうか?

背景: コード内のリレーショナル モデルから直接、liquibase の変更ログを作成するスクリプトがあります。モデルが列が一意であることを示した場合、生成スクリプトは両方の宣言を作成しました。生成された結果をクリーンアップしていて、宣言の 1 つを削除したいのですが、それが適切かどうかを知りたいです。

4

2 に答える 2

6

PostgreSQL のドキュメントを参照してください。

注: テーブルに一意の制約を追加するための推奨される方法は、ALTER TABLE ... ADD CONSTRAINT です。一意の制約を強制するためのインデックスの使用は、直接アクセスしてはならない実装の詳細と見なすことができます。ただし、一意の列に手動でインデックスを作成する必要はないことに注意してください。これを行うと、自動作成されたインデックスが複製されるだけです。

したがって、一意の制約は、一意のインデックスを使用して (PostgreSQL で) 実装される概念です。

于 2011-06-20T10:43:29.343 に答える
1

ターゲットのDBMSに依存すると思います。

PostgreSQL、Oracle、および DB2 では、一意のインデックスと一意の制約の間に違いがあります。

ユニーク制約は外部キー制約のターゲットになることができますが、ユニーク インデックスはできません。それがMySQLと同じかどうかはわかりません。

于 2011-05-13T21:23:06.770 に答える