限制SQL中的约束条件
SQL中的约束条件意味着我们在数据库上应用了一些条件或限制。这进一步意味着在将数据插入数据库之前,我们需要检查一些条件。如果我们对要插入的数据应用的条件对于数据库来说是真实的,那么数据才会插入到数据库表中。
SQL中的约束条件可以分为两种类型:
- 列级约束: 列级约束用于对单个列应用约束。
- 表级约束: 表级约束用于对多个列应用约束。
约束条件的一些现实生活示例如下:
- 每个人都有唯一的电子邮件地址。这是因为在为任何用户创建电子邮件帐户时,提供电子邮件服务(如Gmail、Yahoo或任何其他电子邮件提供服务)将始终检查用户希望为自己获取的电子邮件地址的可用性。如果其他用户已经使用了用户所需的电子邮件地址,那么该地址不能分配给另一个用户。这意味着同一电子邮件提供服务中不能出现两个用户具有相同电子邮件地址的情况。因此,在电子邮件提供服务的数据库中,电子邮件地址是约束条件。
- 每当我们为任何系统设置密码时,都必须遵循某些约束条件。这些约束条件可能包括以下内容:
- 密码中必须有一个大写字母。
- 密码长度必须至少为八个字符。
- 密码必须包含至少一个特殊符号。
SQL中可用的约束条件为:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
- CREATE INDEX
现在让我们尝试通过示例详细了解SQL中不同的约束条件。我们将使用MySQL数据库来编写所有的查询。
1. NOT NULL
- NULL表示空,即值不可用。
- 当一个表的列被声明为NOT NULL时,该列的值对于表的任何记录都不能为空。
- 列上的NOT NULL约束条件必须存在值。
注意:NULL不代表零。NULL表示空列,甚至不是零。
在创建表时应用NOT NULL约束条件的语法:
CREATE TABLE TableName (ColumnName1 datatype NOT NULL, ColumnName2 datatype,…., ColumnNameN datatype);
例子:
创建一个学生表,并在创建表时对表的某一列应用NOT NULL约束。
CREATE TABLE student(StudentID INT NOT NULL, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40));
为了验证表的列上应用了非空约束并且学生表被成功创建,我们将执行以下查询:
mysql> DESC student;
将 NOT NULL 约束应用于现有表的列的语法:
ALTER TABLE TableName CHANGE Old_ColumnName New_ColumnName Datatype NOT NULL;
示例:
考虑一个已存在的学生数据表,没有应用任何约束。后来,我们决定在表的一个字段上应用一个非空约束。然后我们将执行以下查询:
mysql> ALTER TABLE student CHANGE StudentID StudentID INT NOT NULL;
为了验证 not null 约束应用到了 student 表的列上,我们将执行以下查询:
mysql> DESC student;
2. UNIQUE
- 在应用UNIQUE约束的列中,不允许重复的值。
- 具有唯一约束的列将始终包含唯一值。
- 此约束可以应用于一个或多个表的列,这意味着单个表上可以存在多个唯一约束。
- 使用UNIQUE约束,您还可以修改已创建的表。
在单个列上应用UNIQUE约束的语法:
CREATE TABLE TableName (ColumnName1 datatype UNIQUE, ColumnName2 datatype,…., ColumnNameN datatype);
示例:
创建一个学生表,并在创建表时在表的某列上应用唯一约束。
mysql> CREATE TABLE student(StudentID INT UNIQUE, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40));
为了验证唯一约束是否应用到了表的列上,并且学生表已经成功创建,我们将执行以下查询:
mysql> DESC student;
在多个列上应用UNIQUE约束的语法:
CREATE TABLE TableName (ColumnName1 datatype, ColumnName2 datatype,…., ColumnNameN datatype, UNIQUE (ColumnName1, ColumnName 2));
示例:
创建一个学生表,并在创建表时对多个列应用唯一约束。
mysql> CREATE TABLE student(StudentID INT, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40), UNIQUE(StudentID, Student_PhoneNumber));
要验证唯一约束是否应用于多个表列,并且学生表已成功创建,我们将执行以下查询:
mysql> DESC student;
将UNIQUE约束应用于现有表的列的语法:
ALTER TABLE TableName ADD UNIQUE (ColumnName);
示例:
考虑我们有一个已存在的名为student的表,其中没有应用任何约束。后来,我们决定向表的某一列应用UNIQUE约束。然后我们执行如下查询:
mysql> ALTER TABLE student ADD UNIQUE (StudentID);
要验证唯一约束是否应用于表的列,并且学生表已成功创建,我们将执行以下查询:
mysql> DESC student;
3. PRIMARY KEY
- 主键约束是NOT NULL约束和唯一性约束的结合。
- NOT NULL约束和唯一性约束一起构成主键约束。
- 应用了主键约束的列将始终包含唯一的值,并且不允许空值。
创建表时主键约束的语法:
CREATE TABLE TableName (ColumnName1 datatype PRIMARY KEY, ColumnName2 datatype,…., ColumnNameN datatype);
示例:
创建一个学生表,并在创建表时应用主键约束。
mysql> CREATE TABLE student(StudentID INT PRIMARY KEY, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40));
为了验证主键约束是否应用到表的列上,并且学生表已经成功创建,我们将执行以下查询:
mysql> DESC student;
将主键约束应用于现有表的列的语法:
ALTER TABLE TableName ADD PRIMARY KEY (ColumnName);
示例:
考虑我们有一个存在的学生表,没有应用任何约束。后来,我们决定对该表的列应用PRIMARY KEY约束。然后我们将执行以下查询:
mysql> ALTER TABLE student ADD PRIMARY KEY (StudentID);
要验证主键约束是否应用于学生表的列,我们将执行以下查询:
mysql> DESC student;
4. FOREIGN KEY 外键
- 外键用于实现引用完整性。
- 当我们有两个表,并且一个表引用另一个表时,即两个表中存在相同的列,并且该列在一个表中作为主键。那个特定的列将在另一个表中作为外键。
在创建表时应用外键约束的语法:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
示例:
创建一个员工表并在创建表时应用FOREIGN KEY约束。
在任何表上创建外键之前,我们首先需要在一个表上创建一个主键。
mysql> CREATE TABLE employee (Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR (40), Emp_Salary VARCHAR (40));
为了验证主键约束是否应用于员工表的列中,我们将执行以下查询:
mysql> DESC employee;
现在,我们将编写一个查询,在部门表上应用一个外键,该外键引用员工表的主键,即,Emp_ID。
mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID));
要验证外键约束是否应用于部门表的列,我们将执行以下查询:
mysql> DESC department;
对使用约束名的外键约束应用语法:
CREATE TABLE tablename(ColumnName1 Datatype PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
例子:
在创建表时,创建一个员工表并应用外键约束,并指定一个约束名。
若要在任何表上创建外键,首先需要在表上创建主键。
mysql> CREATE TABLE employee (Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR (40), Emp_Salary VARCHAR (40));
为了验证主键约束应用于学生表的列,我们将执行以下查询:
mysql> DESC employee;
现在,我们将编写一个查询,在部门表上应用一个带有约束名称的外键,该外键指向员工表的主键,即Emp_ID。
mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, CONSTRAINT emp_id_fk FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID));
验证外键约束已应用到 department 表的列的方法是执行以下查询:
mysql> DESC department;
将外键约束应用于现有表的列的语法:
ALTER TABLE Parent_TableName ADD FOREIGN KEY (ColumnName) REFERENCES Child_TableName (ColumnName);
示例:
考虑我们有一个现有的员工和部门的表。后来,我们决定对部门表的列应用一个外键约束。然后我们将执行以下查询:
mysql> DESC employee;
mysql> ALTER TABLE department ADD FOREIGN KEY (Emp_ID) REFERENCES employee (Emp_ID);
要验证外键约束是否应用于部门表的列,我们将执行以下查询:
mysql> DESC department;
5. CHECK
- 当对表的列应用检查约束,并且用户想要插入该值时,该值将在插入到该列之前首先进行某些条件的检查。
- 例如: 如果我们在一个表中有一个年龄列,那么用户将可以插入任何他选择的值。用户还可以输入负值或任何其他无效值。但是,如果用户对年龄列应用了条件大于18的检查约束。那么在这种情况下,即使用户尝试插入一个无效值,如零或任何小于18的其他值,年龄列也不会接受该值,并且由于对年龄列应用了检查约束,不允许用户插入它。
应用检查约束到单个列的语法:
CREATE TABLE TableName (ColumnName1 datatype CHECK (ColumnName1 Condition), ColumnName2 datatype,…., ColumnNameN datatype);
示例:
创建一个学生表,并在创建表时应用CHECK约束,以检查年龄是否小于或等于15岁。
mysql> CREATE TABLE student(StudentID INT, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40), Age INT CHECK( Age <= 15));
要验证检查约束是否应用于学生表的列,我们将执行以下查询:
mysql> DESC student;
应用检查约束条件到多个列的语法:
CREATE TABLE TableName (ColumnName1 datatype, ColumnName2 datatype CHECK (ColumnName1 Condition AND ColumnName2 Condition),…., ColumnNameN datatype);
示例:
创建一个学生表,并在创建表时应用CHECK约束来检查年龄是否小于等于15岁,百分比是否大于85。
mysql> CREATE TABLE student(StudentID INT, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40), Age INT, Percentage INT, CHECK( Age <= 15 AND Percentage > 85));
为了验证检查约束是否应用于年龄和百分比列,我们将执行以下查询:
mysql> DESC student;
在现有表的列上应用检查约束的语法:
ALTER TABLE TableName ADD CHECK (ColumnName Condition);
示例:
考虑我们有一个现有的表student。后来,我们决定对student表的列应用CHECK约束。然后我们将执行以下查询:
mysql> ALTER TABLE student ADD CHECK ( Age <=15 );
要验证约束条件是否应用于学生表的列,请执行以下查询:
mysql> DESC student;
6. DEFAULT 默认值
每当给表的列应用默认约束,并且用户没有指定要插入的值时,则会将在应用默认约束时指定的默认值插入到该特定列中。
在表创建过程中应用默认约束的语法:
CREATE TABLE TableName (ColumnName1 datatype DEFAULT Value, ColumnName2 datatype,…., ColumnNameN datatype);
示例:
创建一个名为student的表,并在创建表的同时应用默认约束。
mysql> CREATE TABLE student(StudentID INT, Student_FirstName VARCHAR(20), Student_LastName VARCHAR(20), Student_PhoneNumber VARCHAR(20), Student_Email_ID VARCHAR(40) DEFAULT "anuja.k8@gmail.com");
为了验证默认约束应用于学生表的列,我们将执行以下查询:
mysql> DESC student;
ALTER TABLE TableName ALTER ColumnName SET DEFAULT Value;
示例:
考虑我们有一个已经存在的表student。后来,我们决定在student表的列上应用DEFAULT约束。然后我们将执行以下查询:
mysql> ALTER TABLE student ALTER Student_Email_ID SET DEFAULT "anuja.k8@gmail.com";
为了验证学生表的列是否应用了默认约束,我们将执行以下查询:
mysql> DESC student;
7. CREATE INDEX 创建索引
CREATE INDEX约束用于在表上创建索引。索引对用户来说是不可见的,但它们可以帮助用户加快从数据库中搜索或检索数据的速度。
在单列上创建索引的语法:
CREATE INDEX IndexName ON TableName (ColumnName 1);
例子:
在创建表时,在学生表上创建索引,并应用默认约束。
mysql> CREATE INDEX idx_StudentID ON student (StudentID);
为了验证创建索引约束是否应用于student表的列,我们将执行以下查询:
mysql> DESC student;
在多列上创建索引的语法:
CREATE INDEX IndexName ON TableName (ColumnName 1, ColumnName 2, ColumnName N);
示例:
mysql> CREATE INDEX idx_Student ON student (StudentID, Student_PhoneNumber);
为了验证创建索引约束是否应用于学生表的列上,我们将执行以下查询:
mysql> DESC student;
在现有的表上创建索引的语法:
ALTER TABLE TableName ADD INDEX (ColumnName);
考虑我们有一个现有的表student。后来,我们决定在student表的列上应用DEFAULT约束。然后我们将执行以下查询:
mysql> ALTER TABLE student ADD INDEX (StudentID);
要验证创建索引约束是否应用于学生表的列,请执行以下查询:
mysql> DESC student;