Limitare la colonna varchar () a valori specifici?


94

C'è un modo per specificare, ad esempio, 4 valori distinti per una colonna varchar in MS SQL Server 2008?

Ad esempio, ho bisogno di una colonna denominata Frequenza (varchar) che accetti solo "Giornaliero", "Settimanale", "Mensile", "Annuale" come valori possibili

È possibile impostarlo all'interno di SQL Server Management Studio durante la creazione della tabella?


5
Se è lecito ritenere che non ci saranno più valori validi e ci saranno molte righe nella tabella, codificherei i valori possibili in qualcosa di più piccolo e più veloce di un varchar ().
Wikser

Risposte:


127

Hai già esaminato l'aggiunta di un check constraintin quella colonna che limiterebbe i valori? Qualcosa di simile a:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)

2
Grazie - ha funzionato benissimo. Un piccolo cambiamento che ho dovuto fare è stato che anche "Frequency IN ...." doveva essere racchiuso tra parentesi. A SQL Server Studio non è piaciuto senza per qualche motivo.
Adam

1
Questo controllo dei vincoli fa distinzione tra maiuscole e minuscole?
RWendi

3
Penso che ti sei perso un coma dopo la quarta rigaFrequency varchar(200)
BillOverFlow,

RWendi: le regole di confronto di SQL Server predefinite non fanno distinzione tra maiuscole e minuscole, che si applica a livello di database. Ulteriori informazioni qui stackoverflow.com/questions/1439485/...~~V~~singular~~3rd
jwoe

57

Vuoi un vincolo di controllo .

I vincoli CHECK determinano i valori validi da un'espressione logica che non è basata sui dati in un'altra colonna. Ad esempio, l'intervallo di valori per una colonna salario può essere limitato creando un vincolo CHECK che consente solo i dati che vanno da $ 15.000 a $ 100.000. Ciò impedisce che gli stipendi vengano inseriti oltre la normale fascia di stipendio.

Vuoi qualcosa come:

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

Puoi anche implementare vincoli di controllo con funzioni scalari, come descritto nel link sopra, che è il modo in cui preferisco farlo.


1
anche questa risposta era buona .. perché non possiamo accettarne più di una !! :)
Adam

1
Sì, questo è meglio :), +1 per quello
Owais Qureshi

11

Personalmente, lo codificherei come tinyint e:

  • O: cambialo in testo sul client, controlla il vincolo tra 1 e 4
  • Oppure: usa una tabella di ricerca con una chiave esterna

Motivi:

  • Ci vorranno in media 8 byte per memorizzare il testo, 1 byte per tinyint. Su milioni di righe, questo farà la differenza.

  • E le regole di confronto? "Daily" è uguale a "DAILY"? Occorrono risorse per fare questo tipo di confronto.

  • Infine, cosa succede se si desidera aggiungere "Bisettimanale" o "Ogni ora"? Ciò richiede una modifica dello schema quando è possibile aggiungere semplicemente nuove righe a una tabella di ricerca.


5

Quando si modifica una tabella, fare
clic con il pulsante destro del mouse -> Controlla vincoli -> Aggiungi -> Digitare qualcosa come Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')nel campo espressione e un buon nome di vincolo nel campo (Nome).
Hai fatto.

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.