SQL 如何使用CHECK
在本文中,您将学习如何在SQL查询中使用CHECK关键字来对列进行约束。
SQL中的CHECK是什么?
CHECK是一种SQL约束,允许数据库用户只输入满足指定条件的值。如果某个列被定义为CHECK约束,则该列只包含TRUE值。
以下语法用于在创建表时向列添加CHECK约束:
CREATE TABLE Table_Name
(
Column_Name_1 DataType (character_size of the column_1) CHECK (Boolean_Expression),
Column_Name_2 DataType (character_size of the column_2) CHECK (Boolean_Expression),
Column_Name_3 DataType (character_size of the column_3) CHECK (Boolean_Expression),
........,
Column_Name_N DataType (character_size of the column_N) CHECK (Boolean_Expression)
) ;
我们可以轻松地在一个SQL表中的一个或多个列中使用CHECK约束。
当表已经存在时,以下语法将CHECK约束添加到列中:
ALTER TABLE Table_Name ALTER COLUMN Column_Name datatype CHECK;
如果您想在创建表时使用CHECK约束,您需要按照以下步骤进行操作:
- 创建新的数据库
- 创建带有CHECK约束的新表
- 插入值
- 查看表的记录
第一步:创建简单的新数据库
首先,您需要在结构化查询语言中创建一个新的数据库。以下查询将在SQL服务器中创建名为“Voting”的新数据库:
CREATE Database Voting;
第二步:创建新表并添加CHECK约束
以下查询创建了 People_Info 表,并将CHECK约束添加到 People_Age 列中:
CREATE TABLE People_Info
(
People_ID INT NOT NULL PRIMARY KEY,
People_Name VARCHAR (100),
People_Gender Varchar(20),
People_Age INT NOT NULL CHECK (People_Age >=18),
People_Address Varchar (80)
);
第三步:插入值
下面的INSERT查询根据应用于People_Age列的CHECK约束条件,将符合条件的人员记录插入到People_Info表中:
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1001, Arush, Male, 20, Agra);
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1002, Bulbul, Female, 30, Lucknow);
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1004, Saurabh, Male, 20, Lucknow);
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1005, Shivani, Female, 25, Agra );
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1006, Avinash, Male, 22, Delhi);
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1007, Shyam, Male, 19, Banglore);
下面的查询显示了约束失败错误,因为我们已经在People_Age列上应用了约束,这个列只能保存大于18的值。
INSERT INTO People_Info (People_ID, People_Name, People_Gender, People_Age, People_Address) VALUES (1003, Ram, Male, 15, Delhi);
第四步:查看数据表的数据
以下查询显示了People_Info表的数据。
SELECT * FROM People_Info;
People_ID | People_Name | People_Gender | People_Age | People_Address |
---|---|---|---|---|
1001 | Arush | Male | 20 | Agra |
1002 | Bulbul | Female | 30 | Lucknow |
1004 | Saurabh | Male | 20 | Lucknow |
1005 | Shivani | Female | 25 | Agra |
1006 | Avinash | Male | 22 | Delhi |
1007 | Shyam | Male | 19 | Banglore |
如我们在上面的People_Info表中可以看到,People_Age列中包含年龄大于18的人的年龄。
在多列上添加检查约束
以下的CREATE TABLE查询会在Doctor_Info表上指定多列的CHECK约束:
CREATE TABLE Doctor_Info
(
Doctor_ID INT NOT NULL PRIMARY KEY,
Doctor_Name VARCHAR (100),
Doctor_Specialist VARCHAR (80) CHECK (Doctor_Specialist = 'Cancer'),
Doctor_GenderVarchar (20) CHECK (Dcotor_Gender = 'Male'),
Doctor_Country Varchar (80) CHECK (Doctor_Country = 'U. K.')
) ;
以下查询插入了那些是癌症专家、男性且来自英国的多个医生的记录。
INSERT INTO Doctor_Info (Doctor_ID, Doctor_Name, Doctor_Specialist, Doctor_Gender, Doctor_Country) VALUES ( 1035, Jones, Cancer, Male, U. K.),
(1015, Moris, Cancer, Male, U. K.),
(1003, Harry, Cancer, Male, U. K.),
(1044, Bunny, Cancer, Male, U. K.),
(1025, Moria, Cancer, Male, U. K.);
下面的查询显示了Doctor_Info表的详细信息:
SELECT * FROM Doctor_Info;
Doctor_ID | Doctor_Name | Doctor_Disease | Doctor_Gender | Doctor_Country |
---|---|---|---|---|
1035 | Jones | Cancer | Male | U. K. |
1015 | Moris | Cancer | Male | U. K. |
1003 | Harry | Cancer | Male | U. K. |
1044 | Bunny | Cancer | Male | U. K. |
1025 | Moria | Cancer | Male | U. K. |
添加CHECK约束到现有表
任何数据库用户都可以通过在SQL ALTER查询中使用ADD关键字来轻松地向现有表添加CHECK约束。
指定CHECK约束到现有表的语法:
ALTER TABLE Table_Name ADD CONSTRAINT Constraint_Name CHECK(Boolean_Expression);
以下ALTER语句指定了上述People_Info表中People_Address列的CHECK约束:
ALTER TABLE People_Info ADD CONSTRAINT chk_people_address CHECK(People_Address = 'Lucknow');
从表中删除CHECK约束
使用ALTER语句中的DROP关键字,数据库用户可以删除表的列中的CHECK约束。
如果您想从SQL表中删除CHECK约束,可以使用以下语法进行删除:
ALTER TABLE Table_Name DROP CONSTRAINT Contraint_Name;
以下查询从People_Info表的People_Address列中删除CHECK约束:
ALTER TABLE People_Info DROP CONSTRAINT chk_people_address;