【Transact-SQL】CHECK / CONSTRAINT

--[例5.7]  Student表的Ssex只允許取“男”或“女”。
     CREATE TABLE StudentCheck
          ( Sno  CHAR(9) PRIMARY KEY,
            Sname CHAR(8) NOT NULL,                     
            Ssex  CHAR(2)  CHECK(Ssex IN('男','女')),     /*性別屬性Ssex只允許取'男'或'女'*/
            Sage  SMALLINT,
            Sdept  CHAR(20)
          );

測試:

1.

INSERT INTO  StudentCheck (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128','王輝','男','IS',18);

成功插入一條數據

2. 

INSERT INTO  StudentCheck (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215129','王輝','F','IS',18);
INSERT 語句與 CHECK 約束"CK__StudentChe__Ssex__1BC821DD"衝突。該衝突發生於數據庫"Student",表"dbo.StudentCheck", column 'Ssex'。

執行失敗。

因爲F沒有在集合{男、女}中。這個約束的默認名稱爲:CK__StudentChe__Ssex__1BC821DD。


--[例5.10]建立學生登記表Student,要求學號在90000~99999之間,姓名不能取空值,年齡小於30,性別只能是“男”或“女”。
    CREATE TABLE StudentCONSTRAINT
      (   Sno  NUMERIC(6)
          CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
          Sname  CHAR(20)  
          CONSTRAINT C2 NOT NULL,
          Sage  NUMERIC(3)
          CONSTRAINT C3 CHECK (Sage < 30),
          Ssex  CHAR(2)
          CONSTRAINT C4 CHECK (Ssex IN ('男','女')),
          CONSTRAINT StudentKey PRIMARY KEY(Sno)
        );

C2 NOT NULL

C2找不到 ~ why?

T-SQL:嚴格地說NULL/NOT NULL不算約束,因此,沒有約束名。(此說法待考證)

INSERT INTO  StudentCONSTRAINT
VALUES ('201215','王輝',18,'F');
INSERT 語句與 CHECK 約束"C1"衝突。該衝突發生於數據庫"Student",表"dbo.StudentCONSTRAINT", column 'Sno'。

錯誤信息使用 C1 作爲約束名。 

由此可見,沒有顯示命名,系統會自動命名。有自定義顯示命名,用自定義的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章