MySql--约束和级联操作

约束(constraint)和级联操作

一、什么是约束及为什么要使用约束

  • 约束实际上就是表中数据的限制条件
  • 表在设计的时候加上约束的目的是为了保证表中的记录完整和有效

二、约束的种类

非空约束 not null
唯一性约束 unique
主键约束 primary key(简称PK)
外键约束 foreign key(简称FK)
检查约束【目前mysql不支持,oracle支持】

2.1 非空约束

not null约束的字段,不能为null,必须给定具体的数据

创建学生表,给字段添加非空约束:用户名不能为空

create table t_user(
    id int(10),
    name varchar(32) not null,
    email varchar(128)
);

2.2 唯一性约束

unique约束的字段具有唯一性,不可重复

创建用户表,保证邮箱地址唯一

列级约束
create table t_user(
    id int(10),
    name varchar(32) not null,
    email varchar(128) unique 
);

insert into t_user(id,name) values(2,'abc');//成功
insert into t_user(id,name) values(3,'def');//成功

"unique约束"约束的字段不能重复,但是可以为null

表级约束:
create table t_user(
    id int(10),
    name varchar(32) not null,
    email varchar(128),
    unique(email) 
);

使用表级约束给多个字段联合添加约束
以下程序表示name和email两个字段联合唯一
create table t_user(
    id int(10),
    name varchar(32) not null,
    email varchar(128),
    unique(name,email)
);

表级约束可以给约束起名字:以后可以通过这个名字来删除这个约束:

create table t_user(
    id int(10),
    name varchar(32) not null,
    email varchar(128),
    constraint t_user_email_unique unique(email)
);

not null和unique可以联合使用,被not null unique约束的字段,级不能为空,也不能重复:

create table t_user(
    id int(),
    name varchar(32) not null unique
);

insert into t_user(id,name) values(1,'jack');//成功
insert into t_user(id,name) values(2,'jack');//失败
insert into t_user(id) values(3);//失败

2.3 主键约束(primary key 简称PK)

涉及到的术语:

主键约束
主键字段
主键值

关系:

表中的某个字段添加主键约束之后,该字段被称为主键字段,
主键字段中出现的每一个数据都被称为主键值

作用:

给某个字段添加主键约束primary key之后,该字段不能重复,
并且也不能为空。效果和"not null unique"约束相同,
但本质不同,主键约束除了可做到"not null unique"之外,
主键字段还会默认添加"索引-index"

一张表应该有主键字段,若没有,表示这张表是无效的。
"主键值"是当前行数据的唯一标识。
即使表中的两行记录相关的数据是相同的,但是由于主键值不同,
我们认为这是两行完全不同的数据。

分类:

根据字段分:
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束    
无论是单一主键还是复合主键,一张表主键约束只能有一个。

根据性质分:
自然主键:主键是一个自然数,这个自然数和当前表的业务没有任何关系
业务主键:主键值和当前表中业务紧密相关,当业务数据发生改变时,
         主键值通常会受到影响,所以不建议使用。

例:

单一主键:
列级约束:
create table t_user(
    id int(10) primary key,
    name varchar(32)
);
表级约束:(起名)
create table t_user(
    id int(10),
    name varchar(32),
    constraint t_user_id_pk primary key(id)
);

复合主键:(只能使用表级约束)
create table t_user(
    id int(10),
    name varchar(32),
    email varchar(128),
    primary key(id,name)
);
也可以起名:
create table t_user(
    id int(10),
    name varchar(32),
    email varchar(128),
    constraint t_user_id_name_pk primary key(id,name)
);  

在mysql数据库管理系统中提供了一个自增的数字,专门用来自动生成主键值。主键值不需要用户维护和提供,自动生成。这个自增的数字默认从1开始,以1递增:1,2,3,4,5,6,7,8....
例:

create table t_user(
    id int(10) primary key auto_increment,
    name varchar(32)
);

2.4 外键约束(foreign key 简称FK)

涉及到的术语:

外键约束
外键字段
外键值

关系:

某个字段添加外键约束之后,该字段称为外键字段,
外键字段中的每一个数据都是外键值。

分类:

单一外键:给一个字段添加外键约束
复合外键:给多个字段联合添加一个外键约束

一张表中可以有多个外键字段

例:

设计数据库表用来存储学生和班级信息:

学生信息和班级信息之间的关系,一个班级对应多个学生(一对多关系)
方案一:将学生信息和班级信息存储到一张表中。(缺点:数据冗余)
学生信息表t_student
学生信息.PNG
方案二:将学生信息和班级信息分开两张表存储:学生表+班级表
学生表 t_student
学生表.PNG
班级表 t_class
班级表.PNG

结论:为了保证t_student表中的classno字段中的数据必须来自于t_class表中cno字段中的数据,有必要给t_student表中的classno字段添加外键约束,classno字段被称为外键字段,该字段中的100 200 300被称为外键值。classno这里是一个单一外键字段

注意:

1.外键值可以为null
2.外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束。
3.有了外键引用之后,表分为父表和子表
  以上父表是:班级表
  字表是:学生表
 创建表:先创建父表,再创建子表;
 删除数据:先删除子表中的数据,再删除父表中的数据;
 插入数据:先插入父表中的数据,再插入子表中的数据。

SQL文:

drop table if exists t_student;
drop table if exists t_class;
create table t_class(
    cno int(3) primary key,
    cname varchar(128) not null unique
);
create table t_student(
    sno int(3) primary key,
    sname varchar(32) not null,
    classno int(3),
    constraint t_student_classno_fk foreign key(classno) references t_class(cno)
);
insert into t_class(cno,cname) values(100,'高三1班');
insert into t_class(cno,cname) values(200,'高三2班');
insert into t_class(cno,cname) values(300,'高三3班');
insert into t_student(sno,sname,classno) values(1,'jack',100);
insert into t_student(sno,sname,classno) values(2,'lucy',100);
insert into t_student(sno,sname,classno) values(3,'zhangsan',100);
insert into t_student(sno,sname,classno) values(4,'ford',200);
insert into t_student(sno,sname,classno) values(5,'king',200);
insert into t_student(sno,sname,classno) values(6,'allen',300);
insert into t_student(sno,sname,classno) values(7,'lisi',300);

找出每个学生的班级名称

select s.*,c.* from t_student s join t_class c on s.classno=c.cno;

注意:多对一关系,是在多的一方加外键

三、级联更新与删除

在删除父表中的数据的时候,级联删除子表中的数据on delete cascade;
在更新父表中的数据时候,级联更新子表中的数据on update cascade;
级联操作在外键约束后面添加

级联操作要谨慎使用,因为级联操作会将数据改变或者删除

例:

alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on delete cascade;

alter table t_student add
constraint t_student_classno_fk
foreign key(classno) references t_class(cno) on update cascade;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容