Spalte varchar () auf bestimmte Werte beschränken?

94

Gibt es eine Möglichkeit, beispielsweise 4 verschiedene Werte für eine varchar-Spalte in MS SQL Server 2008 anzugeben?

Zum Beispiel brauche ich eine Spalte namens Frequenz (varchar), die nur 'Täglich', 'Wöchentlich', 'Monatlich', 'Jährlich' als mögliche Werte akzeptiert

Kann dies beim Erstellen der Tabelle im SQL Server Management Studio festgelegt werden?

Adam
quelle
5
Wenn man davon ausgehen kann, dass es keine gültigen Werte mehr gibt und die Tabelle viele Zeilen enthält, würde ich die möglichen Werte in etwas kleiner und schneller als varchar () codieren.
Wikser

Antworten:

127

Haben Sie bereits darüber nachgedacht, in check constraintdieser Spalte ein Element hinzuzufügen , das die Werte einschränkt? Etwas wie:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)
Ashish Gupta
quelle
2
Danke - das hat super funktioniert. Eine kleine Änderung, die ich vornehmen musste, war, dass "Frequenz IN ...." ebenfalls in Klammern stehen musste. SQL Server Studio mochte es aus irgendeinem Grund nicht ohne.
Adam
1
Ist bei dieser Einschränkungsprüfung die Groß- und Kleinschreibung zu beachten?
RWendi
3
Ich denke, Sie haben ein Koma nach der 4. Zeile verpasstFrequency varchar(200)
BillOverFlow
RWendi - Bei der Standard-SQL Server-Sortierung wird die Groß- und Kleinschreibung nicht berücksichtigt, was auf Datenbankebene gilt. Weitere Infos hier stackoverflow.com/questions/1439485/…
jwoe
57

Sie möchten eine Prüfbedingung .

CHECK-Einschränkungen bestimmen die gültigen Werte aus einem logischen Ausdruck, der nicht auf Daten in einer anderen Spalte basiert. Beispielsweise kann der Wertebereich für eine Gehaltsspalte begrenzt werden, indem eine CHECK-Einschränkung erstellt wird, die nur Daten im Bereich von 15.000 bis 100.000 US-Dollar zulässt. Dies verhindert, dass Gehälter über den regulären Gehaltsbereich hinaus eingegeben werden.

Du willst so etwas wie:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

Sie können auch Prüfeinschränkungen mit Skalarfunktionen implementieren, wie im obigen Link beschrieben. So bevorzuge ich es.

Michael Petrotta
quelle
1
Diese Antwort war auch gut. Warum können wir nicht mehr als eine akzeptieren? :)
Adam
1
Ja, das ist besser :), +1 dafür
Owais Qureshi
11

Persönlich würde ich es als tinyint codieren und:

  • Entweder: Ändern Sie es in Text auf dem Client, überprüfen Sie die Einschränkung zwischen 1 und 4
  • Oder: Verwenden Sie eine Nachschlagetabelle mit einem Fremdschlüssel

Gründe dafür:

  • Das Speichern von Text dauert durchschnittlich 8 Bytes, für tinyint 1 Byte. Über Millionen von Zeilen hinweg wird dies einen Unterschied machen.

  • Was ist mit Kollation? Ist "Täglich" dasselbe wie "TÄGLICH"? Für diesen Vergleich sind Ressourcen erforderlich.

  • Was ist, wenn Sie "Zweiwöchentlich" oder "Stündlich" hinzufügen möchten? Dies erfordert eine Schemaänderung, wenn Sie einer Nachschlagetabelle einfach neue Zeilen hinzufügen können.

gbn
quelle
5

Wenn Sie eine Tabelle bearbeiten,
klicken Sie mit der rechten Maustaste -> Einschränkungen überprüfen -> Hinzufügen -> Geben Sie etwas Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')in das Ausdrucksfeld und einen guten Einschränkungsnamen in das Feld (Name) ein.
Du bist fertig.

Denis K.
quelle