介绍

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

约束的作用就是为了保证:表中的数据有效。

类型

非空约束:not null

唯一性约束:unique

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

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

检查约束:check(mysql不支持,oracle支持)

主要介绍

介绍重点的几个约束

非空约束

受到非空约束的字段不能为null.

例如:

drop table if exists user;
create table user(
id int,
name varchar(255) not null
);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'lisi'); insert into user(id) values(3); //这一行name没有值,设计表的时候也没有默认值,会报下面的错
ERROR 1364 (HY000): Field 'name' doesn't have a default value

唯一性约束

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

列级约束

drop table if exists user;
create table user(
id int,
name varchar(255) unique,// 约束直接添加到列后面的,叫做列级约束
email varchar(255)
);
insert into user(id,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into user(id,name,email) values(2,'lisi','lisi@123.com');
insert into user(id,name,email) values(3,'wangwu','wangwu@123.com'); insert into user(id,name,email) values(4,'wangwu','wangwu@sina.com');//插入这行数据时,会报下面的错误,因为name字段已经设置为唯一。
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name' insert into user(id) values(4);

执行上面的脚本后,表结构如下:

id name email
1 zhangsan zhangsan@123.com
2 lisi lisi@123.com
3 wangwu wangwu@123.com
4 NULL NULL

name字段虽然被unique约束了,但是可以为NULL。

表级约束

如果需要两个或者多个字段联合起来具有唯一性,就需要用到表级唯一约束。

例如:

drop table if exists user;
create table user(
id int,
name varchar(255),
email varchar(255),
unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。
);
insert into user(id,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into user(id,name,email) values(2,'zhangsan','zhangsan@sina.com'); insert into user(id,name,email) values(3,'zhangsan','zhangsan@sina.com');
ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@sina.com' for key 'name'

unique 和not null联合

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

表结构如下:

Field Type Null Key Default Extra
id int(11) YES NULL
name varchar(255) NO PRI NULL

在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段(下面就讲)。

插入数据时:

insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'zhangsan'); //error:name不能重复
insert into user(id) values(2); //error:name不能为NULL

主键约束

主键值是每一行记录的唯一标识,类似身份证号码。任何一张表都应该有主键,没有主键,表无效

主键的特征:not null + unique(前面提到过)

单个字段添加主键

1.列级约束

drop table if exists user;
// 1个字段做主键,叫做:单一主键
create table user(
id int primary key, //列级约束
name varchar(255)
);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'lisi'); insert into user(id,name) values(2,'wangwu');//error:不能重复
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY' insert into user(name) values('zhaoliu');//error:不能为NULL
ERROR 1364 (HY000): Field 'id' doesn't have a default value

2.表级约束

drop table if exists user;
create table user(
id int,
name varchar(255),
primary key(id) // 表级约束
);
insert into user(id,name) values(1,'zhangsan'); insert into user(id,name) values(1,'lisi');//error:不能重复
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

多个字段联合添加主键

id和name联合起来做主键:复合主键

drop table if exists user;
create table user(
id int,
name varchar(255),
email varchar(255),
primary key(id,name)
);
insert into user(id,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into user(id,name,email) values(1,'lisi','lisi@123.com'); insert into user(id,name,email) values(1,'lisi','lisi@123.com');//error:不能重复
ERROR 1062 (23000): Duplicate entry '1-lisi' for key 'PRIMARY'

在实际开发中不建议使用:复合主键。建议使用单一主键!因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。复合主键比较复杂,不建议使用。

注意事项

1.不能添加两个主键

一张表中主键只能有一个,不能有两个,不然就会像下面的例子那样报错。

drop table if exists user;
create table user(
id int primary key,
name varchar(255) primary key
);
ERROR 1068 (42000): Multiple primary key defined

2.主键值建议使用:int,bigint,char等类型。不建议使用:varchar来做主键。主键值一般都是数字,

一般都是定长的!

3.分类

主键除了单一主键和复合主键之外,还可以分为自然主键和业务主键。

自然主键:主键值是一个自然数,和业务没关系。

业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

在实际开发中自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。业务主键不好,因

为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以业务主键不建议使

用。尽量使用自然主键。

4.主键自增(auto_increment)

drop table if exists user;
create table user(
id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增
name varchar(255)
);
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
id name
1 zhangsan
2 zhangsan
3 zhangsan
4 zhangsan
5 zhangsan

外键约束

在MySQL中,外键约束用于确保两个表之间的数据一致性。外键约束是一种限制,它将一个表中的列与另一个表中的列相关联。具体来说,它要求在一个表中的某个列中的值必须在另一个表的某个列中存在。外键约束可以确保数据的完整性和一致性,防止数据被删除或修改时发生错误。

创建外键约束

1.创建主表及从表

CREATE TABLE user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(50)
); CREATE TABLE room (
room_id INT PRIMARY KEY,
room_date DATE,
user_id INT,
);

2.创建约束

ALTER TABLE room
ADD CONSTRAINT fk_room_user
FOREIGN KEY (user_id) REFERENCES user(user_id);

fk_room_user是外键约束的名称,FOREIGN KEY子句用于指定要添加外键约束的列,REFERENCES子句用于指定关联表和列。

使用外键约束

插入数据:当向"orders"表中插入数据时,如果在"user_id"列中插入一个不存在于"user"表中的值,则会引发外键约束错误。

INSERT INTO room (room_id, room_date, user_id)
VALUES (1, '2023-05-11', 10);
-- Error: Cannot add or update a child row: a foreign key constraint fails

更新数据:当更新"user"表中的"user_id"列中的值时,如果在"room"表中存在与该值匹配的"user_id"值,则会引发外键约束错误。

UPDATE user SET user_id = 2 WHERE user_id = 1;
-- Error: Cannot delete or update a parent row: a foreign key constraint fails

mysql基础_约束的更多相关文章

  1. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  2. mysql基础之约束

    约束的目的: 1.约束保证数据的完整性和一致性. 2.约束分为表级约束 和 列级 约束.(针对约束字段的数目的多少来确定的) 3.约束类型包括 not null (非空约束) primary key( ...

  3. MySQL基础_索引

    MySQL 索引(入门): 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些 ...

  4. mysql基础_事务

    定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...

  5. mysql基础_操作文件中的内容

    1.插入数据: insert into t1(id,name) values(1,'alex'); #向t1表中插入id为1,name为'alex'的一条数据 2.删除: delete from t1 ...

  6. mysql基础_数据类型

    1.数字 (1)tinyint(小整数值) 范围:有符号(-128,127) 无符号(0.255) (2)int(大整数值) 范围:有符号  (-2 147 483 648,2 147 483 647 ...

  7. mysql基础_操作数据库以及表

    1.数据库的操作 create database 数据库名:#一般创建方式 create database 数据库名 show databases;#查看所有数据 drop database 数据库名 ...

  8. MySQL基础(三)——约束

    MySQL基础(三)--约束 约束是在表上强制执行的数据校验规则,主要用于维护表中数据的完整性以及当数据之间有以来关系时,保护相关的数据不会被删除. 根据约束对列的限制,可以划分为:单列约束(只约束一 ...

  9. MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64、MySQL5.7)

    MySQL基础环境_安装配置教程(Windows7 64或Centos7.2 64.MySQL5.7) 安装包版本 1)     VMawre-workstation版本包 地址: https://m ...

  10. MySQL基础(6) | check约束

    MySQL基础(6) | check约束 前言 在一些情况下,我们需要字段在指定范围的输入, 例如:性别只能输入 '男'或者'女',余额只能大于0等条件, 我们除了在程序上控制以外,我们还能使用 CH ...

随机推荐

  1. ASP.NET Core - 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  2. Android JAVA连接MQTT,以及常见问题

    本文介绍如何使用Android(JAVA)客户机连接MQTT服务器 第一步先引入MQTT 在 build.gradle 添加以下: dependencies { implementation 'org ...

  3. HashMap实现原理和自动扩容

    HashMap实现原理: JDK1.7:数组+单向链表(头插) 在并发情况下头插可能出现循环链表(死循环)问题.原因:因为头插,在新数组中链表的元素顺序发生了变化, 如上图,假设线程1在扩容,刚刚调整 ...

  4. SQL Server 2005递归查询

    WHIT XXX(列1,列2....) AS ( SELECT 列1,列2... FROM 表WHERE ID=xxxxxx UNION ALL SELECT 列1,列2.... FROM 表 WHE ...

  5. 2022-12-19:大的国家。如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者 人口至少为 2500 万(即 250000

    2022-12-19:大的国家.如果一个国家满足下述两个条件之一,则认为该国是 大国 : 面积至少为 300 万平方公里(即,3000000 km2),或者 人口至少为 2500 万(即 250000 ...

  6. 2022-05-14:语法补全功能,比如“as soon as possible“, 当我们识别到“as soon as“时, 基本即可判定用户需要键入“possible“。 设计一个统计词频的模型,

    2022-05-14:语法补全功能,比如"as soon as possible", 当我们识别到"as soon as"时, 基本即可判定用户需要键入&quo ...

  7. 2021-02-19:给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角。沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。请问最小距离累加和是多少?

    2021-02-19:给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角.沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和.请问最小距离累加和是多少? 福哥答案2021-02 ...

  8. 浅谈 OI 中各种合并操作

    前言 合并操作一直是 OI 中一大考点,今天请各位跟着笔者来梳理一下各种合并操作. 启发式合并 几乎可以说是最经典的合并了. 假定我们可以在 \(O(k)\) 的时间内往某个集合中插入一个数,那么我们 ...

  9. 小程序 Page "pages/posts/post-detail/post-detail" has not been registered yet.

    今使用wx.navigateTo进行页面跳转老是提示Page "pages/posts/post-detail/post-detail" has not been register ...

  10. Python基础 - 解释性语言和编译性语言

    什么是机器语言 计算机是不能理解高级语言,当然也就不能直接执行高级语言了.计算机只能直接理解机器语言,所以任何语言,都必须将其翻译成机器语言,计算机才能运行高级语言编写的程序.   如何把我们写的代码 ...