С Liquibase, есть ли разница между использованием уникального <createIndex>и <column>с уникальным ограничением? - PullRequest
8 голосов
/ 13 мая 2011

У Liquibase есть два способа определить столбец как уникальный:

  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>
    

Есть ли разница между этими двумя подходами для одноколоночных уникальных ключей?

В моих собственных наблюдениях с MySQL похоже, что нет никакой разницы . Обе декларации (выше) дают одинаковый результат SHOW CREATE TABLE:

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

Однако, верно ли это для всех реализаций базы данных или <createIndex unique="true"> генерирует различные выходные данные схемы из <constraint unique="true"/> для разных баз данных?

Предыстория: у меня есть скрипт, который построил журнал изменений ликвидазы непосредственно из моей реляционной модели в коде. Сценарий генерации создал ОБА декларации, если модель указала, что столбец уникален. Я очищаю сгенерированные результаты и хотел бы удалить одно из объявлений, и хочу знать, подходит ли это.

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

См. Документация PostgreSQL:

Примечание: предпочтительный способ добавить единственным ограничением для таблицы является ALTER ТАБЛИЦА ... ДОБАВИТЬ ОГРАНИЧЕНИЯ. Использование индексы для обеспечения уникальных ограничений можно считать реализацией деталь, которая не должна быть доступна непосредственно. Надо, однако, быть осознавая, что нет необходимости вручную создавать индексы по уникальным столбцам; это будет просто дублировать автоматически созданный индекс.

Таким образом, уникальное ограничение - это концепция, которая реализована (в PostgreSQL) с уникальным индексом.

1 голос
/ 14 мая 2011

Я думаю, это зависит от целевой СУБД.

В PostgreSQL, Oracle и DB2 существуют различия между уникальным индексом и уникальным ограничением.

Ограничение уникальности может быть целью ограничения внешнего ключа, но индекс уникальности не может.Не знаю, так ли это с MySQL.

...