8.1 约束简介
含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性分类:not null:非空,用于保证该字段的值不能为空。比如姓名、学号default:默认,用于保证该字段有默认值primary key:主键,用于保证该字段的值具有唯一性,并且非空unique:唯一,用于保证该字段的值具有唯一性,可以为空foreign key:外键,限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值添加约束的时机:1.创建表时2.修改表时约束的分类:列级约束:六大约束都支持,但外键约束没有效果表级约束:除了非空、默认、其他都支持create table 表名(字段名 字段类型 列级约束,字段名 字段约束,表级约束)
8.2 案例
列级约束
mysql> create table major(id int primary key,majorname varchar(20));Query OK, 0 rows affected (0.00 sec)mysql> create table stuinfo(id int primary key,stuname varchar(20) not null,gender char(1) check (gender ='男'or gender='女'),seat int unique,age int default 18,majorId int references major(id));Query OK, 0 rows affected (0.00 sec)mysql> desc stuinfo;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || stuname | varchar(20) | NO | | NULL | || gender | char(1) | YES | | NULL | || seat | int(11) | YES | UNI | NULL | || age | int(11) | YES | | 18 | || majorId | int(11) | YES | | NULL | |+---------+-------------+------+-----+---------+-------+6 rows in set (0.06 sec)mysql> mysql> show index from stuinfo;+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Nut |+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+| stuinfo | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | || stuinfo | 0 | seat | 1 | seat | A | 0 | NULL | NULL | YE |+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+-----+2 rows in set (0.00 sec)
表级约束
mysql> create table stuinfo(id int,stuname varchar(20),gender char(1),seat int,age int,majorId int,primary key(id),unique(seat));
主键和唯一的大比对
唯一性 是否允许为空 一个表中 是否允许组合
主键 √ × 至多有1个 可以,不推荐
唯一 √ √ 可以有多个 可以,不推荐
修改表时添加约束
mysql> create table stuinfo(id int,stuname varchar(20),seat int,age int,majorid int);Query OK, 0 rows affected (0.00 sec)mysql> desc stuinfo;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || stuname | varchar(20) | YES | | NULL | || seat | int(11) | YES | | NULL | || age | int(11) | YES | | NULL | || majorid | int(11) | YES | | NULL | |+---------+-------------+------+-----+---------+-------+5 rows in set (0.00 sec)mysql> alter table stuinfo modify column stuname varchar(20) not null;Query OK, 0 rows affected (0.00 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc stuinfo;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || stuname | varchar(20) | NO | | NULL | || seat | int(11) | YES | | NULL | || age | int(11) | YES | | NULL | || majorid | int(11) | YES | | NULL | |+---------+-------------+------+-----+---------+-------+5 rows in set (0.00 sec)mysql> alter table stuinfo modify column age int default 18;Query OK, 0 rows affected (0.00 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc stuinfo;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| id | int(11) | YES | | NULL | || stuname | varchar(20) | NO | | NULL | || seat | int(11) | YES | | NULL | || age | int(11) | YES | | 18 | || majorid | int(11) | YES | | NULL | |+---------+-------------+------+-----+---------+-------+5 rows in set (0.00 sec)mysql>mysql> alter table stuinfo modify column id int primary key;Query OK, 0 rows affected (0.00 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc stuinfo;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || stuname | varchar(20) | NO | | NULL | || seat | int(11) | YES | | NULL | || age | int(11) | YES | | 18 | || majorid | int(11) | YES | | NULL | |+---------+-------------+------+-----+---------+-------+5 rows in set (0.00 sec)
8.3 标识列
标识列又称为自增长列,含义:可以不用手动的插入值,系统提供默认的序列值
