10.5 主键约束
重点 : 一张表只有一个主键,必须记住。
10.5.1 怎么给一张表添加主键约束 (使用列级约束加入主键约束)
第一步: 判断是否存在t_user表,如果存在将整个表删除并创建一个新的表
drop table if exists t_user; create table t_user( id int primary key, username varchar(255), email varchar(255) ); 复制代码
第二步: 插入数据
insert into t_user(id,username,email) values(1,'zs','zs@123.com'); insert into t_user(id,username,email) values(3,'ls','ls@123.com'); insert into t_user(id,username,email) values(2,'ww','ww@123.com');
第三步 : 查看表结构
desc t_user;
第四步 : 查看表中的数据
插入错误的数据
insert into t_user(id,username,email) values(1,'ww','ww@123.com');
解释 :报错的原因是插入的id的字段值与以前插入的字段值重复。
insert into t_user(username,email) values('ww','ww@123.com');
解释 : 字段id没有默认值,报错的原因是插入id字段值为NULL。
10.5.2 根据以上的测试得出的结论:
- id是主键,因为添加了主键约束,主键字段中的数据不能为NULL,也不能重复。
10.5.3 主键的特点 :
- 不能为NULL
- 不能重复
10.5.3 主键的相关的术语
- 主键约束 : primary key
- 主键字段 : i字段添加primary key之后,id叫做主键字段
- 主键值 : id字段中的每一个值都是主键值
10.5.4 主键有什么作用
- 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
- 主键的作用 : 主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号一样)
10.5.5 使用表级约束方式定义主键 :
第一步 :删除表并创建新表
drop table if exists t_user; create table t_user( id int, username varchar(255), primary key(id) ); 复制代码
第二步 : 插入数据
insert into t_user(id,username) values(1,'zs'); insert into t_user(id,username) values(2,'ls'); insert into t_user(id,username) values(3,'ww'); insert into t_user(id,username) values(4,'cs');
第三步 : 查看表结构
desc t_user;
注意 : id此时为主键,所以NULL不能为YES,key字段为PRI,代表为主键。
第四步 : 查看表的数据
select * from t_user;
插入错误的数据
insert into t_user(id,username) values(4,'cx');
解释: 出现错误,原因是插入的id数据重复。
10.6 主键值自增 (重点)
10.6.1 mysql提供主键值自增:
删除旧表,创建新表
drop table if exists t_user; create table t_user( id int primary key auto_increment, username varchar(255) ); 复制代码
注意 :id字段自动维护一个自增的数字,从1开始,以1递增。
插入数据 :
insert into t_user(username) values('a'); insert into t_user(username) values('a'); insert into t_user(username) values('a'); insert into t_user(username) values('a'); insert into t_user(username) values('a'); insert into t_user(username) values('a');
查看此时表的结构
注意 :extra代表的是 额外的,可以看到这个表结构中添加了额外的数据,即主键值自增。
查看表的数据
注意 :可以看出id是从1开始自增的,
提示 ;在oracle中也提供了一个相同的自增机,叫做:序列(sequence)对象。
10.7 外键约束
10.7.1 关于外键约束的相关术语
- 外键约束 : foreign key
- 外键字段 : 添加有外键约束的字段
- 外键值 : 外键字段中的每一个值
10.7.2 将以上表的建表语句写出来 :
注意 : t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。
先删除子表在删除父表 drop table if exists t_student; drop table if exists t_class; 先创建父表在创建子表 create table t_class( cno int, cname varchar(255), primary key(cno) ); create table t_student( son int, sname varchar(255), classno int, foreign key(classno) references t_class(cno) ); insert into t_class values(101,'xxxxxxxxxxxxx'); insert into t_class values(102,'yyyyyyyyyyyyy'); insert into t_student values(1,'zs1',101); insert into t_student values(1,'zs1',101); insert into t_student values(1,'zs1',101); insert into t_student values(1,'zs1',101); insert into t_student values(1,'zs1',101); select * from t_class; select * from t_student; 复制代码
插入错误数据
insert into t_student values(7,'lisi',103);
错误信息 :
mysql> insert into t_student values(7,'lisi',103); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (bjpowernode
.t_student
, CONSTRAINT t_student_ibfk_1
FOREIGN KEY (classno
) REFERENCES t_class
(cno
))
10.7.3 外键可以为你NULL嘛?
外键值可以为 NULL。
第一步 : 插入外键为空的
insert into t_student(son,sname) values(6,'zs6');
第二步 : 查看数据
select * from t_student;