Share via


CHECK kısıtlamaları

Bir sütun tarafından kabul edilen değerler sınırlayarak, etki alanı bütünlüğü kısıtlamalarını zorlamak CHECK.Put değerleri kontrol, bunlar yabancı anahtar kısıtlamaları için benzer bir sütun.Nasıl bunlar geçerli değerler belirlemek fark vardır: Geçerli değerler listesini başka yabancı anahtar kısıtlamaları elde tablo ve başka bir sütundaki verileri alarak, mantıksal bir ifade geçerli değerleri sınırlamaları belirlemek CHECK. Örneğin, değerler aralık bir Maaş Yalnızca 15.000 TL ile 100.000 arasında verileri sağlayan bir CHECK kısıtlaması oluşturarak sütun sınırlı. Bu, maaşları normal maaş aralık girilen engeller.

TRUE veya FALSE döndürür Boole işleçleri temel herhangi Boole (Boole) ifade ile bir CHECK kısıtlaması oluşturabilirsiniz.Önceki örnekte, mantıksal bir ifade edilir: salary >= 15000 AND salary <= 100000.

Tek bir sütun için birden çok CHECK sınırlamalar geçerli olabilir.Tek bir CHECK kısıtlaması için birden çok sütun tablo düzeyinde oluşturarak da uygulayabilirsiniz.Örneğin, birden çok sütunlu bir CHECK kısıtlaması herhangi ile satırı onaylamak için kullanılabilir bir Ülke/bölge sütun değeriA.B.D. iki karakter değeri de vardırSTATE sütun.Bu birden çok koşul, tek bir yerde denetlenmesini sağlar.

Uyarı

Örtülü veya açık bir veri türü dönüştürme içeren kısıtlamaları, belirli işlemlerin başarısız olmasına neden olabilir.Örneğin, bölüm geçiş kaynakları tabloları üzerinde tanımlı tür kısıtlamaları, ALTER tablo... ANAHTAR işlemin başarısız olmasına neden olabilir.Veri türü dönüştürme kısıtlama tanımlarındaki kaçının.

CHECK sınırlamaları sınırlamaları

CHECK kısıtlamaları, YANLıŞ olarak değerlendirme değerleri reddedebilir.null değerler için BILINMEYEN değerlendirmek için bunların varlığı ifadelerde bir kısıtlama geçersiz kılabilir.For example, suppose you place a constraint on an int column MyColumn specifying that MyColumn can contain only the value 10 (MyColumn=10).Değeri eklerseniz, NULL olarak Sütunum, the Database Engine NULL ekler ve bir hata döndürür.

Denetimi bir koşul için herhangi bir satırda YANLıŞ olduğunda, BIR CHECK kısıtlaması, DOğRU verir tablo.Yeni oluşturulan bir tablo, her satırı yoksa, bu tablodaki herhangi bir CHECK kısıtlaması geçerli kabul edilir.Bu durum, aşağıdaki örnekte olduğu gibi beklenmeyen sonuçlar oluşturabilir.

CREATE TABLE CheckTbl (col1 int, col2 int);
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS 
BEGIN
   DECLARE @retval int
   SELECT @retval = COUNT(*) FROM CheckTbl
   RETURN @retval
END;
GO
ALTER TABLE CheckTbl
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );
GO

The CHECK constraint being added specifies that there must be at least one row in tablo CheckTbl. Ancak, ALTER TABLE deyim tablo karşı bu kısıtlamanın durumunu denetlemek hiçbir satır bulunduğundan başarılı olur.

CHECK kısıtlamaları DELETE deyimleri sırasında doğrulanır.Bu nedenle, belirli türde bir denetim kısıtlamaları olan tablolara DELETE deyimleri yürütme, beklenmeyen sonuçlar doğurabilir.Örneðin, aþaðýdaki tabloda yürütülen düþünün. CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10)
GO
DELETE CheckTbl WHERE col1 = 10;

The DELETE deyim succeeds, even though the CHECK constraint specifies that tablo CheckTbl must have at least 1 row.