2011-05-13 13 views
6

Liquibase ha due modi per definire una colonna come unici:Con Liquibase, c'è una differenza tra l'utilizzo di un unico <createIndex> e l'utilizzo di <column> con un vincolo univoco?

  1. Quando si crea la tabella, utilizzando <constraints> sulla colonna:

    <createTable tableName="my_table"> 
        <column name="my_column"> 
         <constraints unique="true" 
            uniqueConstraintName="my_table_my_column_uk"> 
        </column> 
    </createTable> 
    
  2. Dopo aver creato la tabella, utilizzando <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> 
    

C'è qualche differenza tra questi due approcci per le chiavi univoche a colonna singola?

Nelle mie osservazioni con MySQL, sembra non esserci differenza. Entrambe le dichiarazioni (sopra) produrre lo stesso risultato SHOW CREATE TABLE:

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

Tuttavia, lo fa valere per tutte le implementazioni di database , o fa <createIndex unique="true"> generare output schema diverso da <constraint unique="true"/> per diversi database?

Background: Ho uno script che ha creato il changelog di liquibase direttamente dal mio modello relazionale nel codice. Lo script di generazione creava ENTRAMBE le dichiarazioni se il modello indicava che la colonna era unica. Sto pulendo i risultati generati e vorrei rimuovere una delle dichiarazioni, e voglio sapere se è appropriato.

risposta

1

Suppongo che dipenda dal DBMS di destinazione.

In PostgreSQL, Oracle e DB2 esistono differenze tra un indice univoco e un vincolo univoco.

Il vincolo univoco può essere il target di un vincolo di chiave esterna ma l'indice univoco non può. Non so se questo è lo stesso con MySQL.

+0

Non credo che installerò alcuna chiave esterna che faccia riferimento a chiavi univoche, quindi non dovrebbe essere un problema. Ma grazie per l'informazione; Farò qualche ricerca aggiuntiva con chiavi/vincoli univoci su database diversi per vedere se le mie modifiche sarebbero problematiche. –

3

Vedi PostgreSQL Documentation:

Nota: Il modo migliore per aggiungere un vincolo univoco ad un tavolo è ALTER TABLE ... Aggiungi vincolo. L'uso degli indici per imporre vincoli univoci potrebbe essere considerato un'implementazione dettaglio a cui non si dovrebbe accedere direttamente . Uno dovrebbe, tuttavia, essere consapevole che non è necessario manualmente creare indici su colonne univoche; farebbe semplicemente duplicare l'indice creato automaticamente.

Quindi un vincolo univoco è un concetto implementato (in PostgreSQL) con un indice univoco.

Problemi correlati