表的约束
约束的作用
保证数据库数据的完整性和一致性。通过数据类型在一定程度上可以起到约束作用,但这远远不够,因此引入了其它约束条件。
主键约束
主键 (primary key) 是一个列或者多个列的组合,其值能唯一的标志表中的一行。主键的关键字primary key。
主键的条件
- 每个表只能定义一个主键
- 主键标识表中唯一的一行,该2行的内容不能为NULL。
- 多个列可以组成复合主键,但在复合主键中一个列名只能出现一次。
在创建表时设置主键约束
create table tt1(
-> id int primary key,
-> name varchar(20)
-> );
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
创建表时设置复合主键
create table tt2(
-> id int,
-> name varchar(20),
-> salary float(7,2),
-> primary key(id,name)
-> );
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| salary | float(7,2) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
在修改表时,添加主键约束
alter table 表名称 add primary key(字段名称)
唯一键约束
唯一约束表示该字段所有的值不能重复,可以为NULL,但只能有一个为NULL,一个表中可以为多个字段添加唯一约束。唯一键的关键字为unique。
创建表时添加唯一约束
create table tt4(
-> id int unique,
-> name varchar(10)
-> );
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
修改表时添加唯一键约束
alter table 表名称 add unique 字段名称
mysql> alter table tt1 add unique(name);
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
删除唯一键约束
alter table 表名称 drop index 唯一键的字段名称
alter table tt1 drop index name;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
唯一键和主键的区别
一个表可以有多个字段设置为唯一键,但只能有一个或者一组字段整体设置为主键,主键不能为NULL,唯一键可以为NULL。
外键约束
外键用来在两个表之间建立链接,一个表可以有多个外键,外键只是本表的一个普通字段,但对应这与之关联的表的主键。
- 将外键所在表称为从表。
- 将与从表关联的表称为主表,主表中的主键与从表中的外键进行关联。
外键的约束条件
- 定义一个表的外键时,主键必须已经存在或者是当前正在创建的表,如果是后一种情况,则从表和主表是同一个表。
- 必须为父表定义主键
- 外键中的值可以为null,只要外键中的非NULL值在指定的主键中可以找到,这个外键就是正确的。
-设置外键的字段与设置主键的字段的数据类型要一致。
创建表时设置外键约束
foreign key (从表字段名称) references 主表名称 (主表主键名称)
主表:班级表
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_id | int(11) | NO | PRI | NULL | |
| class_name | varchar(20) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
创建从表
mysql> create table student(
-> stu_id int primary key,
-> stu_name varchar(20) unique,
-> class_id int,
-> foreign key (class_id) references class(class_id)
-> );
mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| stu_id | int(11) | NO | PRI | NULL | |
| stu_name | varchar(20) | YES | UNI | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+-------+
删除外键约束
待续。。。。。
修改表时添加外键约束
alter table 表名称 add foreign key (本表的字段名称) references 主表名称(主键名称)
mysql> alter table student add foreign key (class_id) references class(class_id);
默认值约束
默认值约束,指定某个字段的默认值,当插入数据时没有给该字段赋值,该字段的值即为默认值。
在创建表时设置默认值约束
l> create table person(
-> name varchar(20),
-> age int(5),
-> country varchar(20) default '中国'
-> );
在修改表时添加默认值约束
mysql> alter table person change country country varchar(20) default 'China';
mysql> desc person;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int(5) | YES | | NULL | |
| country | varchar(20) | YES | | China | |
+---------+-------------+------+-----+---------+-------+
删除默认值约束
删除就是将默认值置NULL,本质和修改是一样的
mysql> alter table person change country country varchar(20) default NULL;
mysql> desc person;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int(5) | YES | | NULL | |
| country | varchar(20) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
非空约束
关键字 not NULL ,表明该字段的内容不能为NULL。
语法和默认值约束是一样的,只是关键字不同而已。