mysql学习

13、约束(Constraint)

13.1 什么是约束 常见的约束有哪些

在创建表的时候,可以给表的字段添加相应的约束,目的是为了保证数据的合法性、有效性、完整性。

表格
id          username(唯一性约束)        password(非空约束)
----------------------------------------------------------

常见约束
非空约束(not null)        约束的字段不能为NULL
唯一约束(unique)		  约束的字段不能重复
主键约束(primary key)	  字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key)	  讲不清楚闲不解释(简称FK)
检查约束(check)		  注意Oracle数据库有check约束,但是mysql没有

13.2 非空约束 not null 注意:只有列级约束

drop table if exists t_user;
create table t_user(
	id int,
	username varchar(255) not null,
	password varchar(255)
);
insert into t_user(id,password) values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default value

修正:
insert into t_user(id,username,password) values(1,'lisi','123');

13.3 唯一性约束 unique

唯一性约束修饰的字段具有唯一性,不能重复,但可以为NULL

1、username不能重复

2、username可以全为NULL


3、联合约束(表级约束):	usercode varchar(255), 
												username varchar(255),
												unique(usercode,username)

案例:给两个列或者多个列加unique唯一性
drop table if exists t_user;
create table t_user(
	id int,
	usercode varchar(255), 
	username varchar(255),
	unique(usercode,username)  //多个字段联合起来添加约束:表级约束
);
insert into t_user values(1,'111''zhangsan');
insert into t_user values(2,'111','lisi');
insert into t_user values(3,'333','wangerma');

正确

区别:上面的是两个字段联合起来约束唯一性
下面的是两条字段都得约束唯一性

create table t_user(
	id int,
	usercode varchar(255) unique,//unique在后面添加称为:列级约束 
	username varchar(255) unique
);
insert into t_user values(1,'111''zhangsan');
insert into t_user values(2,'111','lisi');
insert into t_user values(3,'333','wangerma');

错误:111 有两个

13.4 主键约束

怎样给一张表添加主键约束
drop table if exists t_user;
create table t_user(
	id int primary key,  //列级约束
	username varchar(255),
	email varchar(255)
);
insert into t_user values(1,'zs','zs@123.com');
insert into t_user values(2,'ls','ls@123.com');
insert into t_user values(3,'we','we@123.com');

select * from t_user;
+----+----------+------------+
| id | username | email      |
+----+----------+------------+
|  1 | zs       | zs@123.com |
|  2 | ls       | ls@123.com |
|  3 | we       | we@123.com |
+----+----------+------------+

注意:id添加主键约束 主键中的字段不能重复也不能为NULL

*  主键相关的术语
主键约束
主键字段
主键值

*主键有什么作用呢?
表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键
主键的作用:主键值是这一行记录在这张表的唯一标识(就像身份证号码一样)

*主键的分类
主键字段数量划分
单一主键(推荐的,常用的)
复合主键(多个字段联合添加一个主键)(不建议使用 复合主键违背三范式)
主键的性质划分
自然主键(修改起来很麻烦,最好简单点,可以把身份证号前按照1,2,3,4顺序重新列表,添加主键)
业务主键(主键值和系统业务挂钩例如:拿着身份证号码/银行卡号作为主键)(不推荐使用)

*一张表的主键约束只能有一个(必须记住)

*使用表级约束方式定义主键:
drop table if exists t_user;
create table t_user(
	id int,
	username varchar(255),
	primary key(id)  //表级约束
);
insert into t_user values(1,'zs');
insert into t_user values(2,'ls');
insert into t_user values(3,'we');

*mysql提供主键值自增:(非常重要)
在主键值语句后加 auto_increment

drop table if exists t_user;
create table t_user(
	id int primary key auto_increment,//id字段自动维护一个自增的数字,从1开始,以1递增
	username varchar(255),
);
insert into t_user values('a');
insert into t_user values('b');
insert into t_user values('c');

Oracle当中也提供一个自增机制,叫序列(sequence)对象

13.5 外键约束

关于外键约束相关术语
外键约束:foreign key
外键字段
外键值

业务背景:
设计数据库表,用来维护学生和班级的信息
第一种:一张表
no(pk)          name               classno                     classname
------------------------------------------------------------------------
1                zs1                   101               合肥一中高三1班
2                zs2                   102               合肥一中高三2班
3                zs3                   103               合肥一中高三3班
...
这样写不好 数据冗余

父表:t_class 班级表
cno(pk)           cname
-------------------------------------------------
101               合肥一中高三1班
102               合肥一中高三2班
103               合肥一中高三3班

字表:t_student  学生表
sno(pk)        sname     cno(该字段添加外键约束fk) (字段就来自某个表中)
-------------------------------------------------
1            zs1                    101
2            zs2                    102
3            zs3                    103

将以上表的建表语句写出来:
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(
	sno int,
	sname varchar(255),
	primary key(sno),
	classno int,
	foreign key(classno) references t_class(cno)
);

insert into t_class values(101,'xxxxxxxx');
insert into t_class values(102,'xxxxxxxx');
insert into t_student values(1,'zs1',101);
insert into t_student values(2,'zs2',101);
insert into t_student values(3,'zs3',102);
insert into t_student values(4,'zs4',101);
insert into t_student values(5,'zs5',102);
insert into t_student values(6,'zs6',102);

select * from t_class;
select * from t_student;

mysql> select * from t_class;
+-----+----------+
| cno | cname    |
+-----+----------+
| 101 | xxxxxxxx |
| 102 | xxxxxxxx |
+-----+----------+
2 rows in set (0.00 sec)

mysql> select * from t_student;
+------+-------+---------+
| sno  | sname | classno |
+------+-------+---------+
|    1 | zs1   |     101 |
|    2 | zs2   |     101 |
|    3 | zs3   |     102 |
|    4 | zs4   |     101 |
|    5 | zs5   |     102 |
|    6 | zs6   |     102 |
+------+-------+---------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值