1、主键约束
primary key 主键约束次
auto_increment 自增约束
它能够确认一张表中的一条数据,也就是我们通过给某个字段添加约束,就可以使得该字段不能重复且不为空。
主键不能重复,且不能为空。
当有多个主键时,只要每一主键直接有一个不相同就可以添加数据
方法一:在对应的字段后面添加主键 create table students( id int primary key, name varchar(20) ); 方法二:在最后面添加主键 create table students( id int , name varchar(20), pwd varchar(20), primary key(id,name) ); //主键约束 create table students( id int priment key auto_increment, name varchar(20) ); //一开始没有主键,后来添加主键的方法 alter table students add primary key(id); +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ //删除主键 alter table students drop primary key; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | 0 | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
2、唯一约束
关键字:unique()
特点:设置为唯一约束的字段,数据不可以重复。
当有多个唯一约束时,唯一约束的字段数据要有一个是之前没有的才能添加,可以为空
注意:当唯一约束为空时,可以重复为空,但是不能重复数据
create table student( id int, name varchar(20), unique(name) ); mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | UNI | NULL | | +-------+-------------+------+-----+---------+-------+ //删除唯一约束 alter table student drop index name; mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ //添加唯一约束 alter table student add unique(name); +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(20) | YES | UNI | NULL | | +-------+-------------+------+-----+---------+-------+
3、非空约束
关键字:not null;
特点:非空约束修饰的字段不能为空
create table students( id int primary key, name varchar(20), pwd varchar(20) not null, unique(name) ); +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(20) | YES | UNI | NULL | | | pwd | varchar(20) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+
3、默认约束
关键字:default
特点: 如果一个字段设置了默认约束,那么在添加数据时没有给该字段添加数据时,数据会有一个默认数据。
当默认约束的字段没有数据插入时,会去使用默认数据
有数据插入时使用插入的数据。
create table students( id int not null auto_increment primary key, name varchar(20), age int default 10 ); +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int(11) | YES | | 10 | | +-------+-------------+------+-----+---------+----------------+ //添加数据,不给有默认约束的字段添加时 insert into students(id,name) values(1,'张三'); +----+------+------+ | id | name | age | +----+------+------+ | 1 | 张三 | 10 | +----+------+------+ //当都添加时 insert into students values(2,'法国',29); +----+------+------+ | id | name | age | +----+------+------+ | 1 | 张三 | 10 | | 2 | 法国 | 29 | +----+------+------+
5、外键约束
关键字:foreign key( 副表与主表要关联的字段 ) references 主表名( 主表与副表关联的字段 ),两个字段类型必须一致
特点:要有两张表,一个主表,一个副表;
在给副表添加数据时,副表关联的字段输入的数据,必须是主表中关联字段中的数据
主表插入数据时不会受到副表影响
主表中的数据是被副表引用的,是不可以被删除的
--班级表 create table classes( id int primary key auto_increment not null, name varchar(20) ); --学生表//这个字段是用来与班级表关联的,所以必须和班级表中关联字段的类型必须一致 create table students( id int primary key auto_increment not null, name varchar(20), c_id int, foreign key(c_id) references classes(id) ); //先给主表添加数据 insert into classes values(1,'一班'); insert into classes values(2,'二班'); insert into classes values(3,'三班'); insert into classes values(4,'四班'); +----+------+ | id | name | +----+------+ | 1 | 一班 | | 2 | 二班 | | 3 | 三班 | | 4 | 四班 | +----+------+ //给副表添加数据 insert into students values(1,"zs",1); insert into students values(2,"ls",2); insert into students values(3,"ww",3); insert into students values(4,"lb",4); +----+------+------+ | id | name | c_id | +----+------+------+ | 1 | zs | 1 | | 2 | ls | 2 | | 3 | ww | 3 | | 4 | lb | 4 | +----+------+------+ --当添加一条主表不存在的数据时 insert into students values(5,'ff',5); 插入失败,会有一个错误: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test7`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `classes` (`id`)) --副表中被关联的字段中插入的数据必须是主表关联字段中已经存在的,若不存在,则不能插入。 --主表插入数据不会受到副表影响 --删除主表中的数据 delete from classes where id=4; 插入失败,会有一个错误 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test7`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `classes` (`id`)) --主表中的数剧被副表引用,是不可以被删除的
小绿叶工具设置外键的方法: