SQL 知识量:22 - 44 - 129
约束就是用于管理如何插入或处理数据库数据的规则。
DBMS通过在数据库表上施加约束来实施引用完整性,大多数的约束是在表定义中定义的,例如主键、外键、唯一约束、检查约束等。
由数据库完成约束管理而不是由客户端或人为管理是十分必要的,主要原因是:
如果在客户端层面进行数据库约束管理,那么每个客户端都要被迫实施这些规则和动作,但一定会有客户端忘记或不实施这些规则。
进行任何操作,包括在执行update和delete操作时,也要实施约束管理,这对于客户端来说太繁琐,会消耗掉大量的资源。
执行客户端检查是非常耗时的,而DBMS执行这些检查会相对高效。
主键是一种特殊的约束,用来保证一列(或一组列)中的值是唯一的,而且永远不改动。这方便了直接或交互的处理表中的行,没有主键,要安全的更新或删除特定行而不影响其他行会非常困难。
表中的任何列只有满足以下条件,都可以用于主键:
任意两行的主键值都不相同。
每行都有一个主键值,即不允许有null值。
包含主键值的列从不修改或更新。
主键值不能重用。如果从表中删除了一行,改行的主键值不能再分配给新行。
定义主键的方法主要有两种,一种是在定义表时创建它,另一种是在修改表时创建它。
例如:新建表man,创建(组合)主键id,name。
create table man( id int(11) not null auto_increment, name varchar(255) not null, age int(11) null, sex varchar(255) null, primary key (id,name) );
以上示例中,如果是单个列为主键,也可以在列定义中设置主键。
create table man( id int(11) not null primary key auto_increment, name varchar(255) not null, age int(11) null, sex varchar(255) null );
例如:修改表woman,添加主键id。
alter table woman add primary key (id);
外键是表中的一列,其值必须在另一个表的主键中。外键是保证引用完整性的极其重要的部分。
与主键一样,定义外键的方法主要有两种,一种是在定义表时创建它,另一种是在修改表时创建它。
例如:创建一个考试表exam,其中id_course列与选课表course的主键id关联,即:id_course是考试表exam的外键。
create table exam( id int not null primary key auto_increment, id_course int not null, score int not null, foreign key(id_course) references course(id) );
如果考试表在定义时没有定义外键,现在通过修改语句添加外键,SQL语句为:
alter table exam add foreign key(id_course) references course(id);
唯一约束用于保证一列(或一组列)中的数据是唯一的。类似于主键,但是存在以下区别:
表可以包含多个唯一约束,但主键只能有一个。
唯一约束可以包含null值。
唯一约束可以修改或更新。
唯一约束列的值可以重复使用。
唯一约束不能用于定义外键。
在具体应用中,许多需要确保唯一性的信息都可以使用唯一约束,例如身份证号码、社会信用代码等等。
检查约束用于保证一列(或一组列)中的数据满足一组指定的条件。其常见的用途包括:
检查最小值或最大值。
指定值的范围。
规定只允许特定的值。
检查约束将在数据类型限制的基础上,进一步限制数值的范围,确保插入数据库中的数据是真正合法的(想要的)数据。
注意:并非所有的DBMS都支持检查约束,MySQL目前还不支持,但是Oracle支持。
例如:建立people表,规定年龄必须大于0。
create table people( id int not null primary key auto_increment, name varchar(255) not null, age int not null check(age>0), sex varchar(255) not null );
还可以使用添加的方式设置检查约束,以上对年龄的约束修改为:
add constraint check(age>0);
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6