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','[email protected]');
insert into t_vip (id,name,email) values (2,'lisi','[email protected]');
insert into t_vip (id,name,email) values (3,'wangwu','[email protected]');
insert into t_vip (id,name,email) values
(4,'wangwu','[email protected]');  //插入‘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',[email protected]);
insert into t_vip (id,name,email) values (2,'zhangsan',[email protected]);
这两条都能加入,因为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','[email protected]');
insert into t_vip(id ,name,email) values(1,'lisi','[email protected]');

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

主键值建议使用:
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

你可能感兴趣的:(SQL学习笔记——约束(重要!!!))