Batasi kolom varchar () ke nilai tertentu?

94

Apakah ada cara untuk menentukan, misalnya 4 nilai berbeda untuk kolom varchar di MS SQL Server 2008?

Misalnya, saya memerlukan kolom bernama Frekuensi (varchar) yang hanya menerima 'Harian', 'Mingguan', 'Bulanan', 'Tahunan' sebagai nilai yang memungkinkan

Apakah ini mungkin untuk ditetapkan dalam SQL Server Management Studio saat membuat tabel?

Adam
sumber
5
Jika aman untuk mengasumsikan bahwa tidak akan ada lagi nilai yang valid dan akan ada banyak baris dalam tabel, saya akan mengenkode nilai yang mungkin dalam sesuatu yang lebih kecil dan lebih cepat daripada varchar ().
Wikser

Jawaban:

128

Pernahkah Anda melihat menambahkan check constraintpada kolom itu yang akan membatasi nilai? Sesuatu seperti:

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)
Ashish Gupta
sumber
2
Terima kasih - ini bekerja dengan baik. Satu perubahan kecil yang harus saya lakukan adalah bahwa "Frekuensi IN ...." harus disertakan dalam tanda kurung juga. SQL server studio tidak menyukainya tanpa alasan tertentu.
Adam
1
Apakah pemeriksaan kendala ini peka huruf besar-kecil?
RWendi
3
Saya pikir Anda melewatkan koma setelah baris ke-4Frequency varchar(200)
BillOverFlow
RWendi - pemeriksaan SQL Server default tidak peka huruf besar / kecil, yang berlaku di tingkat database. Info lebih lanjut di sini stackoverflow.com/questions/1439485/…
jwoe
57

Anda menginginkan batasan cek .

PERIKSA kendala menentukan nilai yang valid dari ekspresi logis yang tidak didasarkan pada data di kolom lain. Misalnya, kisaran nilai untuk kolom gaji dapat dibatasi dengan membuat batasan PERIKSA yang memungkinkan hanya data yang berkisar dari $ 15.000 hingga $ 100.000. Hal ini mencegah gaji dimasukkan di luar kisaran gaji reguler.

Anda menginginkan sesuatu seperti:

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

Anda juga dapat mengimplementasikan batasan pemeriksaan dengan fungsi skalar, seperti yang dijelaskan pada tautan di atas, yang saya lebih suka melakukannya.

Michael Petrotta
sumber
1
jawaban ini juga bagus .. kenapa kita tidak bisa menerima lebih dari satu !! :)
Adam
1
Yup yang ini lebih baik :), +1 untuk itu
Owais Qureshi
11

Secara pribadi, saya akan mengkodekannya sebagai tinyint dan:

  • Salah satu: ubah menjadi teks pada klien, periksa batasan antara 1 dan 4
  • Atau: gunakan tabel pencarian dengan kunci asing

Alasan:

  • Diperlukan rata-rata 8 byte untuk menyimpan teks, 1 byte untuk tinyint. Lebih dari jutaan baris, ini akan membuat perbedaan.

  • Bagaimana dengan pemeriksaan? Apakah "Daily" sama dengan "DAILY"? Dibutuhkan sumber daya untuk melakukan perbandingan semacam ini.

  • Terakhir, bagaimana jika Anda ingin menambahkan "Dua mingguan" atau "Setiap Jam"? Ini membutuhkan perubahan skema saat Anda bisa menambahkan baris baru ke tabel pencarian.

gbn
sumber
5

Saat Anda mengedit tabel,
Klik Kanan -> Periksa Batasan -> Tambah -> Ketik sesuatu seperti Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')di bidang ekspresi dan nama kendala yang baik di bidang (Nama).
Kamu selesai.

Denis K
sumber