2012-02-20 16 views

risposta

10

Non sono sicuro se questo è quello che stai cercando, ma ci si potrebbe fare è usare un vincolo di controllo:

CREATE TABLE My_Table(my_column varchar(255) 
    check (my_column in ('first', 'second', 'last'))); 

-- fails: 
insert into My_Table values('x'); 

-- ok: 
insert into My_Table values('first'); 

Ciò funzionerà in H2, Apache Derby, PostgreSQL, HSQLDB, e anche SQLite. Non ho testato altri database.

+0

A proposito, è possibile che un enum e una tabella di riferimento siano più efficienti. –

+0

Il problema è che non esiste un modo per enumerare i valori possibili con questa soluzione (anche se potrebbe non averne bisogno). – Viruzzo

+0

Vuoi dire che non conosci i possibili valori? Come hai potuto usare enum allora? Il tuo esempio è corretto? –

7

Non c'è nessuno; tuttavia, enum non è una buona soluzione in ogni caso, basta usare una tabella di riferimento.

+6

+1 per "enum non è una grande soluzione" –

2

Mi sono imbattuto in questo problema e l'ho risolto creando una tabella separata e un vincolo di chiave esterna.

CREATE TABLE My_Enum_Table (
    my_column varchar(255) UNIQUE 
); 

INSERT INTO My_Enum_Table (my_column) 
VALUES 
    ('First'), 
    ('Second'), 
    ... 
    ('Last'); 

CREATE TABLE My_Table (
    my_column varchar(255), 
    FOREIGN KEY (my_column) REFERENCES My_Enum_Table (my_column) 
); 

In questo modo quando si tenta di fare un INSERT in My_Table farà un controllo chiave esterna per assicurarsi che il valore che si sta inserendo sia in My_Enum_Table.

ci sono alcuni compromessi qui però:

  • PROS
    • È ancora possibile interagire con questo allo stesso modo si farebbe un ENUM.
    • Hai anche un po 'di flessibilità in più, nel senso che puoi aggiungere un altro valore senza dover modificare le definizioni della tabella.
  • CONS
    • Questo è probabilmente più lento di un ENUM dal momento che ha a che fare una tabella di look-up. Realisticamente però dal momento che la tabella dovrebbe avere un numero ragionevolmente piccolo di righe questo è probabilmente abbastanza trascurabile. Aggiungere un indice a My_Table.my_column può essere d'aiuto.
    • Ciò impedisce la necessità di unirsi alla tabella di riferimento ma con lo stesso livello di complessità dal punto di vista del database. Anche se questo probabilmente non è un grosso problema a meno che tu non sia preoccupato di ingombrare il tuo database con un altro tavolo.
    • Ciò richiede anche l'utilizzo di un motore che supporta chiavi esterne, ad esempio INNODB. Non sono sicuro se questo è davvero un CON, ma suppongo che potrebbe essere per qualcuno con esigenze specializzate.
1

Sembra H2 ha enumerazioni: http://www.h2database.com/html/datatypes.html#enum_type

Quindi l'esatto stessa sintassi dovrebbe funzionare. (Non so quanto strettamente la corrispondenza della semantica.)

+0

Ora ha il supporto, [a partire dalla ** versione 1.4.195 **, rilasciata il 2017-04-23] (http://www.h2database.com/html/changelog.html), ma non aveva la domanda è stata scritta. Forse vuoi chiarire la tua risposta. –

Problemi correlati