SQL Server equivalente al tipo di dati enum di MySQL?


Risposte:


155

Non C'è un vago equivalente:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
Perché non utilizzare una tabella che definisce valori validi e quindi utilizzare un vincolo di chiave esterna?
Elaskanator,

@Elaskanator Direi che questo risponde in modo più preciso all'OP diretto, mentre la soluzione migliore è probabilmente l'utilizzo della tabella esterna FK +.
userfuser

Grazie @Elaskanator per avermi ricordato dell'ovvio ... normalizzare i dati e smettere di esistere.
Andrew,

88

La migliore soluzione che ho trovato in questo è creare una tabella di ricerca con i possibili valori come chiave primaria e creare una chiave esterna per la tabella di ricerca.


13
Una soluzione migliore dal punto di vista della manutenibilità rispetto al vincolo di controllo mostrato sopra.
HLGEM,

21
Questa è una soluzione migliore di Enums, anche in MySQL.
ypercubeᵀᴹ

2
@ypercube Perché è meglio anche per MySQL?
BenR,

4
@BenRecord Ci sono diversi problemi con gli enum di MySQL: 8 motivi per cui il tipo di dati ENUM di MySQL è il male . Non sono d'accordo al 100% sul fatto che sia malvagio, ma devi stare molto attento quando li usi.
ypercubeᵀᴹ

1
@BenR anche se ricordo bene, in modalità non rigorosa con MySQL, un enum non valido può essere inserito come NULL. Qualunque sia la condizione, un mio precedente team ha avuto problemi con un enum MySQL che non veniva inserito e non falliva quando il valore non era specificato nell'elenco dei valori. Un vincolo di chiave esterna su una tabella di ricerca provocherebbe un errore. Sono d'accordo che la tabella di ricerca è migliore per MySQL.
Jim Schubert,


2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

Laddove le prestazioni contano, utilizzare ancora i valori rigidi.


1

Ho trovato questo approccio interessante quando volevo implementare enum in SQL Server.

L'approccio menzionato di seguito nel link è abbastanza convincente, considerando che tutte le esigenze di enum del database potrebbero essere soddisfatte con 2 tabelle centrali.

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
Questa è una variante dell'anti-pattern nota come "una vera tabella (di ricerca)". L'approccio corretto è quello di avere una tabella separata per ogni tipo di enum e usare chiavi esterne (se hai bisogno di una ricerca, ciò potrebbe non essere il caso di enumerazioni "pure").
Branko Dimitrijevic,

2
I commenti sulla pagina collegata forniscono un buon backup per l'utilizzo di singole tabelle per ogni "enum", piuttosto che ciò che specifica questa risposta
skia.heliou

4
È abbastanza divertente come la maggior parte delle persone si opponga giustamente a questo progetto, ma l'autore nomina il suo articolo "Best Practice".
underscore_d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.