MySql学习笔记06——约束介绍

这篇具有很好参考价值的文章主要介绍了MySql学习笔记06——约束介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

约束

什么是约束?

约束对应的英语单词:constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性!!!约束的作用就是为了保证:表中的数据有效!!

约束的分类

  • 非空约束 not null
  • 唯一性约束 unique
  • 主键约束primary key
  • 外键约束 foreign key
  • 检查约束 check(mysql不支持,oracle支持)

使用语法:

在创建表的时候

create table 表名(
    字段名1 类型1 约束,
    字段名2 类型2 约束,
    字段名3 类型3 约束
);

非空约束

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');

对于批量化执行SQL语句,我们可以使用执行sql脚本的方法。

  • 创建.sql文件
  • 将语句写入文件
  • source 脚本路径
mysql> source D:\mysql_learning\mysql_learning\document\vip.sql
Query OK, 0 rows affected, 1 warning (0.01 sec)

Query OK, 0 rows affected (0.02 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)
mysql> select * from t_vip;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+

由于给字段name加了非空约束,因此每次添加数据的时候,如果没有添加name字段的数据,就会报错,这样就保证了数据的可行性和完整性。

mysql> insert into t_vip(id) values(123);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

唯一性约束

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

drop table if exists t_vip;
    create table t_vip(
        id int,
        name varchar(255) unique,
        email 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');
    select * from t_vip;

这个时候加上name重复的信息,就会报错。

mysql> insert into t_vip(id,name,email) values(4,'wangwu','wangwu@sina.com');
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 't_vip.name'

新需求:name和email两个字段联合起来具有唯一性!!!!

也就是说,一条新的数据,与表中的数据进行比较,name或者email字段有一个可以重复,但是如果和某一个数据比较,发现name和email字段的信息都重复了,就会报错。

drop table if exists t_vip;
        create table t_vip(
            id int,
            name varchar(255) unique,  // 约束直接添加到列后面的,叫做列级约束。
            email varchar(255) unique
        );

这种创建方式不能满足我们的新要求,因为这样是分别对两个字段进行唯一性约束,两个字段,各自唯一。

如果

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是不一定一样的。

drop table if exists t_vip;
            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');

表级约束一般用在需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束:例如允许重名的情况出现,但是不允许同时email也重复了。

uniquenot null可以联合起来进行约束

drop table if exists t_vip;
        create table t_vip(
            id int,
            name varchar(255) not null unique
        );

在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。(注意:oracle中不一样!)

not null没有表级约束,只能用列级约束

主键约束

primary key简称pk

主键字段:在字段上加上主键约束,该字段就是主键字段。

主键值:主键上的每个值就是主键值。

主键是每一行记录的唯一标识,是一种类似身份证的存在!!

每张表都应该有主键约束,如果没有主键约束,表就无效了。

主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)

列级约束:

create table t_vip(
            id int primary key,  //列级约束
            name varchar(255)
        );
        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');# 报错,id为2,重复了
        ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

        insert into t_vip(name) values('zhaoliu');# 报错,id为null,不能为null
        ERROR 1364 (HY000): Field 'id' doesn't have a default value

表级约束:

create table t_vip(
            id int,
            name varchar(255),
            primary key(id)  // 表级约束
        );

表级约束是用来对多个字段进行联合添加约束:

create table t_vip(
            id int,
            name varchar(255),
            email varchar(255),
            primary key(id,name)  # 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');# 这样是正确的,不会报错

        insert into t_vip(id,name,email) values(1,'lisi','lisi@123.com');# 错误,报错,1-lisi同时重复
        ERROR 1062 (23000): Duplicate entry '1-lisi' for key 'PRIMARY'

一个字段的主键约束被称作单一主键,多个字段联合作为主键被称作复合主键,不推崇复合主键。

同时,一张表只能有一个主键约束。

作为主键约束的字段一般是int bigint char 类型,一般都是定长的,不建议varchar类型

主键除了:单一主键和复合主键之外,还可以这样进行分类?
自然主键:主键值是一个自然数,和业务没关系。
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

在实际开发中使用业务主键多,还是使用自然主键多一些?
自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,
可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。

使用auto_increment自动维护主键值,auto_increment表示自增,从1开始,以1递增!

mysql> create table t_vip(
    ->  id int primary key auto_increment,
    ->  name varchar(32)
    -> );
# 之后多次插入数据:
insert into t_vip(name) values('zhangsan');
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | zhangsan |
|  3 | zhangsan |
|  4 | zhangsan |
|  5 | zhangsan |
|  6 | zhangsan |
|  7 | zhangsan |
|  8 | zhangsan |
+----+----------+

外键约束

当我们要将两个表连接的时候,各自会将一个字段值作为两个表连接的“接口”,但是有时候这两个表中这个字段值会有点出入,导致两个表连接的时候会有记录无法匹配的情况出现,而外键约束则能保证这两个表中,作为两表接口的字段值能完全匹配上。

两个概念:

子表和父表;

子表引用父表中的一个字段值作为外键约束。

顺序:

删除表的顺序?
先删子,再删父。

创建表的顺序?
先创建父,再创建子。

删除数据的顺序?
先删子,再删父。

插入数据的顺序?
先插入父,再插入子。

foreign key(cno) references t_class(classno)

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)# 参照t_class中的classno对cno进行外键约束
);

insert into t_class(classno, classname) values(100, '北京市大兴区亦庄镇第二中学高三1班');
insert into t_class(classno, classname) values(101, '北京市大兴区亦庄镇第二中学高三1班');

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);

select * from t_student;
select * from t_class;
mysql> select * from t_student;
+----+-----------+------+
| no | name      | cno  |
+----+-----------+------+
|  1 | jack      |  100 |
|  2 | lucy      |  100 |
|  3 | lilei     |  100 |
|  4 | hanmeimei |  100 |
|  5 | zhangsan  |  101 |
|  6 | lisi      |  101 |
|  7 | wangwu    |  101 |
|  8 | zhaoliu   |  101 |
+----+-----------+------+
8 rows in set (0.00 sec)

mysql> select * from t_class;
+---------+---------------------------------------------------+
| classno | classname                                         |
+---------+---------------------------------------------------+
|     100 | 北京市大兴区亦庄镇第二中学高三1|
|     101 | 北京市大兴区亦庄镇第二中学高三1|
+---------+---------------------------------------------------+
2 rows in set (0.00 sec)

这个时候如果在外键约束之外添加字段cno的字段值

mysql> insert into t_student(name,cno) values('kuku',110);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bjpowernnode`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`cno`) REFERENCES `t_class` (`classno`))

就会报错。

外键引用父表中的某个字段,该字段应该至少有unique唯一性约束,但不一定是主键

外键值可以是null。文章来源地址https://www.toymoban.com/news/detail-696325.html

到了这里,关于MySql学习笔记06——约束介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「MySQL」数据库约束

    🎇 个人主页 :Ice_Sugar_7 🎇 所属专栏 :数据库 🎇 欢迎点赞收藏加关注哦! 所谓约束,就是在创建表时给这个表 指定一些规则 ,后续插入、修改、删除操作都要遵循这些规则 引入规则是为了进行更强的数据校验 NOT NULL - 指示某列不能存储 NULL 值 UNIQUE - 保证某列的每行必

    2024年03月27日
    浏览(66)
  • MySQL 数据库约束

    目录 一、数据库约束  1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 我们使用数据库来存储数据,一般是希望这里存储的数据是靠谱的,那么如何来保证数据是否靠谱呢? 那么MySQL就提供了一些机

    2024年02月15日
    浏览(60)
  • MySQL:数据库的约束

    目录 1.数据库约束 1.1 非空:not null 1.2 唯一:unique         ​​​​​​​ 1.3 默认值:default 1.4 列描述:comment 1.5 主键约束:primary key 1.6 外键约束 1.7 综合案例 2.插入查询结果 3.聚合函数 4.group by(分组查询) 关系型数据库的一个重要功能,就是需要保证数据的完整性

    2024年02月05日
    浏览(91)
  • MySQL数据库 12:约束

    在MySQL中, 约束是一种限制数据表中列值的规定 。保证数据库中的数据正确,有效性和完整性。MySQL中的约束有以下几种: 1. 主键约束(Primary Key Constraint) :主键是用于唯一标识表中每行记录的列。主键约束要求 每个主键列的值都是唯一的,且不能为NULL 。一个表只能有一

    2024年02月08日
    浏览(50)
  • 【MySQL】数据库的约束

    哈喽,大家好!我是保护小周ღ,本期为大家带来的是 MySQL 数据库中对表的约束, 主要有null (空约束),unique(唯一约束),primary key(主键约束),default(默认值约束), forelgn key(外键约束),check(检查约束),超多实例讲解,通俗易懂。 更多相关知识敬请期待:保护小周ღ *★,°*:

    2023年04月09日
    浏览(57)
  • MySQL数据库:数据库的约束以及数据的聚合、联合查询

    目录 一.关系模型的简要概述 二.数据库的约束  2.1约束类型         2.2NULL约束 2.3 UNIQUE:唯一约束 2.4 默认约束 2.5 PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 2.7 CHECK约束 三.高效率查询 3.1高效率查询的分类 3.2聚合查询 3.2.1聚合函数 3.2.2 GROUP BY子句 3.2.3HAVING 3.3.联合查询

    2024年02月10日
    浏览(67)
  • 【MySQL数据库 | 第十二篇】:约束

    在MySQL中, 约束是一种限制数据表中列值的规定 。保证数据库中的数据正确,有效性和完整性。MySQL中的约束有以下几种: 1. 主键约束(Primary Key Constraint) :主键是用于唯一标识表中每行记录的列。主键约束要求 每个主键列的值都是唯一的,且不能为NULL 。一个表只能有一

    2024年02月08日
    浏览(50)
  • MYSQL数据库学习笔记

    以分号结尾加回车为一个命令 show databases;//展示所有数据库 create database xxx;//创建新的数据库 create database if not exists xxx;//检查是否创建XXX数据库,没有则创建,有则不创建 create database default charset (字节大小);//创建指定字节大小的数据库 drop database xxx;//删除数据库 use xxx;//使用

    2024年02月16日
    浏览(51)
  • MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明

    MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明 MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计 MySQL案例——多表查询以及嵌套查询 MySQL笔记——数据库当中的事务以及Java实现对数据库进

    2024年01月16日
    浏览(75)
  • 【数据库】MySQL数据约束和表关系详解

    目录 1.数据库约束 1.1约束类型 1.2NULL约束 1.3UNIQUE:唯一约束 1.4DEFAULT:默认值约束 1.5PRIMARY:主键约束 1.6FOREIGH KEY:外键约束 2.表的关系 2.1一对一 2.2一对多 2.3多对多 数据库中的数据保存在数据表中,在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包