美文网首页
SQL学习笔记——约束(重要!!!)

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

作者: 芥末海苔QAQ | 来源:发表于2022-06-02 09:13 被阅读0次

约束(重要!!!)

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

类型:

非空约束: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

相关文章

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

    约束(重要!!!) 约束:在创建表时给表中的字段加上一些约束,来保证表中数据的完整性,有效性 类型: 非空约束:n...

  • sql学习笔记3-约束

    主键约束(联合主键约束) 唯一性约束 非空约束 默认值约束 外键约束 1、主键约束 它能够唯一确定一张表中的一条记...

  • SQL基础01

    什么是SQL SQL中常用的关键字 SQL中的语句的种类 SQL中约束 简单约束: 示例: 主键: 添加主键约束原...

  • Oracle SQL 学习笔记14- 约束

    约束(Constraint)概要 约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进...

  • sql中表级约束和列级约束

    sql中表级约束和列级约束,在SQL SERVER中, (1) 对于基本表的约束分为列约束和表约束 约束是限制用户...

  • SQL学习笔记2-数据库基本查询语句

    本库为SQL的学习笔记:数据库语句的基本使用,以终端操作Mysql为例,包括增删改查,约束条件,分类查询语句等。此...

  • 数据库(2)

    SQL 约束(Constraints) SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约...

  • SQL 笔记系列四(约束)

    前言 SQL 约束用于规定表中的字段数据规则。就是为字段添加一些限制要求。如果在操作字段时,数据格式不符合所规定的...

  • 数据库基础知识整理-SQL约束和使用

    数据库基础知识整理-SQL约束和使用 SQL约束 SQL 约束用于规定表中的数据规则,可以在创建表时规定(通过 C...

  • 面试积累之数据库篇(六)

    事务的4大属性:原子性,隔离性,一致性,持久性 sql完整性约束:主键约束唯一约束检查约束外键约束默认约束 sql...

网友评论

      本文标题:SQL学习笔记——约束(重要!!!)

      本文链接:https://www.haomeiwen.com/subject/dzzryrtx.html