SQL学习笔记——约束(重要!!!)

约束(重要!!!)

约束:在创建表时给表中的字段加上一些约束,来保证表中数据的完整性,有效性

类型:

非空约束:not nul
唯一性约束:unique
主键约束:primary key (简称PK)
外键约束:foreign key (简称FK)
检查约束:check (mysql不支持,oracle支持)

  • 非空约束:not nul

约束的字段不能为空(NULL)
not null只有列级约束,没有表级约束

例:
drop table if exists t_vip;
create table t_vip(
  id int,
  name varchar(255) not null
);
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');

有了非空约束,加入字段值为空就会报错
insert into t_vip(id) values(3);

  • 唯一性约束:unique

约束的字段不能重复,但是可以为NULL
drop table if exists_vip
create table t_vip(
  id int,
  name varchar(255) unique,
  enail varchar(255)
);
insert into t_vip (id,name,email) values (1,'zhangsan','zhangsan@123.com');
insert into t_vip (id,name,email) values (2,'lisi','lisi@123.com');
insert into t_vip (id,name,email) values (3,'wangwu','wangwu@123.com');
insert into t_vip (id,name,email) values
(4,'wangwu','wangwu@sina.com');  //插入‘wangwu’重复,报错

可以为null,不算重
  • 列级约束,约束直接加在列后面的
    create table t_vip{
      id int,
      name varchar(255) unique,
      email varchar(255) unique
    };

  • 表级约束,约束没有添加在列后面,
    name和email两个字段联合起来唯一性
    使用场景:需要给多个字段联合起来添加某一约束的时候,需要使用表级约束

create table t_vip{
  id int,
  name varchar(255),
  email varchar(255),
  unique(name,email)
};
insert into t_vip (id,name,email) values (1,'zhangsan',zhangsan@123.com);
insert into t_vip (id,name,email) values (2,'zhangsan',zhangsan@sina.com);
这两条都能加入,因为name和email联合起来不相同

unique和not null联合使用
create table t_vip{
  id int,
  name varchar(255) not null unique
};

PRI:primary key

在mysql中,一个字段被not null 和 unique 联合约束后,自动变成成主键字段。(oracle不一样)

insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'zhangsan'); //错误,name重复
insert into t_vip(id) values (2); //错误,name不能为NULL

  • 主键约束 (primary key,简称pk)重要!!!

主键约束:约束名
主键字段:添加了主键约束的字段
主键值:主键字段中的每个值都要做主键值

作用:
主键值是每一行记录的唯一标识。
实际开发中两条记录可能一样,需要通过主键值来区分
(相当于人员表中两个人姓名,性别一样,需要靠身份证区别)

任何一张表都应该有主键。没有主键,表无效!
主键特征:not null + unique(主键值不能是NULL,同时也不能重复!!!)
一个字段做主键叫:单一主键
写法一:
drop table if exists t_vip;
create table t_vip{
  id int primary key,
  name varchar(255)
};

写法二:
drop table if exists t_vip;
create table t_vip{
  id int,
  name varchar(255),
  primary key(id) //表级约束
};

insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');
insert into t_vip(id,name) values(2,'wangwu'); //错误,不能重复
insert into t_vip(name) values('zhaoliu'); //错误,不能为空

表级约束主要是给多个字段联合起来添加约束,
多个字段联合起来做主键叫:复合主键
PS:实际开发中不建议使用复合主键
主键存在的意义就是单条记录的身份证号,意义达到即可
drop table if exists t_vip;
create table t_vip{
  id int,
  name varchar(255),
  email varchar(255),
  primary key(id,name) //表级约束
};
insert into t_vip(id ,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into t_vip(id ,name,email) values(1,'lisi','lisi@123.com');

一张表主键约束只能添加一个

主键值建议使用:
int
bigint
char

等类型
不建议使用:varchar。主键值一般是定长的数字

主键除了按单一主键和复合主键分类之外,
还可以按
自然主键:主键值是一个自然数,跟业务没关系
业务主键:主键值和业务紧密关联,例如拿银行卡号做主键值
实际开发中使用自然主键比较多,因为主键只要做到不重复就行,不需要有意义,
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响到主键值

mysql中,有一种机制,可以帮助我们自动维护一个主键值
drop table if exists t_vip;
create table t_vip{
  id int primary key auto_increment, //自增
name carchar(255)
};
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
...

主键可以采用自增的方式生成:auto_increment,从1开始


外键约束(foreign key,简称FK)非常重要!!!!!!

外键约束:foreign key
外键字段:该字段上添加了外键约束
外键值:外键字段当中的每一个值

业务背景:
例:设计数据库表,来描述“班级和学生”的信息
方法一:班级和学生存储在一张表中(失败)
t_student

no(pk) name classno calssname
1 jack 100 北京市大兴区亦庄镇第二中学高三1班
2 lucy 100 北京市大兴区亦庄镇第二中学高三1班
3 lilei 100 北京市大兴区亦庄镇第二中学高三1班
4 hanmeimei 101 北京市大兴区亦庄镇第二中学高三2班
5 zhangsan 101 北京市大兴区亦庄镇第二中学高三2班
6 lisi 101 北京市大兴区亦庄镇第二中学高三2班
7 wangwu 101 北京市大兴区亦庄镇第二中学高三2班
8 zhaoliu 101 北京市大兴区亦庄镇第二中学高三2班

缺点:数据冗余,空间浪费

方法二:班级一张表,学生一张表
t_class:班级表 (父表)

classno(pk) calssname
100 北京市大兴区亦庄镇第二中学高三1班
101 北京市大兴区亦庄镇第二中学高三2班

t_student:学生表 (子表)

no(pk) name cno(FK,引用t_class这张表的classno)
1 jack 100
2 lucy 100
3 lilei 100
4 hanmeimei 100
5 zhangsan 101
6 lisi 101
7 wangwu 101
8 zhaoliu 101

当cno字段没有约束时,可能会导致数据无效,可能出现102,但102班级不存在,
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束,
cno字段是外键字段,cno字段中的每一个值都是外键值

删表顺序:先删子表,再删父表
建表顺序:先建父表,再建子表
删除数据:先删子,再删父
插入数据:先插父,再插子

drop table if exists t_student;
drop table if exists t_class;

create table t_class(
  classno int primary key,
  classname varchar(255)
);
create table t_student(
  no int primary key auto_increment,
  name varchar(255),
  cno int,
  foreign key (cno) references t_class(classno)
);

insert into t_class (classno,classname) values(100,'北京市大兴区亦庄镇第二中学高三1班');
insert into t_class (classno,classname) values(101,'北京市大兴区亦庄镇第二中学高三2班');
insert into t_student (name,cno) values('jack',100);
insert into t_student (name,cno) values('lucy',100);
insert into t_student (name,cno) values('lilei',100);
insert into t_student (name,cno) values('hanmeimei',100);
insert into t_student (name,cno) values('zhangsan',101);
insert into t_student (name,cno) values('lisi',101);
insert into t_student (name,cno) values('wangwu',101);
insert into t_student (name,cno) values('zhaoliu',101);

子表中的外键引用父表中的某个字段,被引用的这个字段不一定是主键,但至少又unique约束(否则不知道用的是哪个)
外键值可以为NULL

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

推荐阅读更多精彩内容