SQL Server entspricht dem Datentyp MySQL-Aufzählung?

Antworten:

155

Das tut es nicht. Es gibt ein vages Äquivalent:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
Chaos
quelle
10
Warum nicht eine Tabelle verwenden, die gültige Werte definiert, und stattdessen eine Fremdschlüsseleinschränkung verwenden?
Elaskanator
@Elaskanator Ich würde sagen, dass dies das direkte OP am genauesten beantwortet, während die beste Lösung dafür wahrscheinlich die Verwendung der externen Tabelle FK + ist.
Userfuser
Vielen Dank an @Elaskanator, dass Sie mich an das Offensichtliche erinnert haben.
Andrew
87

Die beste Lösung, die ich hier gefunden habe, besteht darin, eine Nachschlagetabelle mit den möglichen Werten als Primärschlüssel zu erstellen und einen Fremdschlüssel für die Nachschlagetabelle zu erstellen.

user1431422
quelle
13
Eine bessere Lösung aus Sicht der Wartbarkeit als die oben gezeigte Prüfbedingung.
HLGEM
21
Dies ist eine bessere Lösung als Enums - auch in MySQL.
Ypercubeᵀᴹ
2
@ypercube Warum ist es auch für MySQL besser?
BenR
4
@BenRecord Es gibt verschiedene Probleme mit den Aufzählungen von MySQL: 8 Gründe, warum der ENUM-Datentyp von MySQL böse ist . Ich stimme nicht zu 100% zu, dass es böse ist, aber Sie müssen besonders vorsichtig sein, wenn Sie sie verwenden.
Ypercubeᵀᴹ
1
@BenR Auch wenn ich mich richtig erinnere, kann im nicht strengen Modus mit MySQL eine ungültige Aufzählung als NULL eingefügt werden. Unabhängig von der Bedingung hatte ein vorheriges Team von mir Probleme damit, dass eine MySQL-Enumeration nicht eingefügt wurde und nicht fehlschlug, wenn der Wert nicht in der Werteliste angegeben war. Eine Fremdschlüsseleinschränkung für eine Nachschlagetabelle würde einen Fehler verursachen. Ich bin damit einverstanden, dass die Nachschlagetabelle für MySQL besser ist.
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...

Wenn es auf die Leistung ankommt, verwenden Sie immer noch die harten Werte.

Dimitrios Staikos
quelle
1

Ich fand diesen interessanten Ansatz, als ich Enums in SQL Server implementieren wollte.

Der unten im Link erwähnte Ansatz ist sehr überzeugend, da alle Ihre Anforderungen an die Datenbankaufzählung mit zwei zentralen Tabellen erfüllt werden könnten.

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

user_v
quelle
8
Dies ist eine Variation des Anti-Musters, das als "eine wahre (Nachschlag-) Tabelle" bekannt ist. Der richtige Ansatz besteht darin, für jeden Aufzählungstyp eine eigene Tabelle zu haben und Fremdschlüssel zu verwenden (wenn Sie überhaupt nachschlagen müssen, was bei "reinen" Aufzählungen möglicherweise nicht der Fall ist).
Branko Dimitrijevic
2
Die Kommentare auf der verlinkten Seite bieten eine gute Sicherung für die Verwendung einzelner Tabellen für jede "Aufzählung", anstatt das, was diese Antwort angibt
skia.heliou
4
Es ist ziemlich lustig, wie die meisten Leute dieses Design zu Recht ablehnen würden, aber der Autor nennt seinen Artikel "Best Practice".
underscore_d