一文带你了解MySQL之约束

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

一文带你了解MySQL之约束

在SQL标准中,一共规定了6种不同的约束,包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习。


1. 约束的概念

约束是作用于表中列上的规则,用于限制加入表的数据。例如,作为主键的列一定是非空的唯一的,否则将无法对数据进行区分。约束的存在保证了数据库中数据的正确性、有效性和完整性。所以约束在数据库设计中是非常重要的。

2. 约束的分类

前面说到SQL标准把约束分为了6大类,分别是非空约束,唯一约束,主键约束,检查约束,默认约束和外键约束,添加约束时我们只需要在SQL中添加关键词,便可以限制表中的数据。

约束类型 功能
非空约束 NOT NULL 保证列中所有的数据不能有null值
唯一约束 UNIQUE 保证列中所有数据各不相同
主键约束 PRIMARY KEY 主键是一行数据的唯一标识,要求非空且唯一
检查约束 CHECK 保证列中的值满足某一条件
默认约束 DEFAULT 保存数据时,未指定值则采用默认值
外键约束 FOREIGN KEY 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

3. 非空约束

目的:保证列中所有的数据不能有null值

添加约束:

CREATE TABLE 表名(
	列名 数据类型 NOT NULL,);

建完表后添加非空约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;

删除约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型;

4. 唯一约束

目的:保证列中所有数据各不相同

添加约束:

CREATE TABLE 表名(
	列名 数据类型 UNIQUE [AUTO_INCREMENT],
	-- AUTO_INCREMENT: 当不指定值时自动增长);

CREATE TABLE 表名(
	列名 数据类型,[CONSTRAINT] [约束名称] UNIQUE(列名)
);

建完表后添加唯有约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;

删除约束:

ALTER TABLE 表名 DROP INDEX 字段名;

5. 主键约束

目的:主键是一行数据的唯一标识,要求非空且唯一

添加约束:

CREATE TABLE 表名(
	列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],);

CREATE TABLE 表名(
	列名 数据类型,
	[CONSTRAINT] [约束名称] PRIMARY KEY(列名)
);

建完表后添加主键约束:

ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

删除约束:

ALTER TABLE 表名 DROP PRIMARY KEY;

6. 默认约束

目的:保存数据时,未指定值则采用默认值

添加约束:

CREATE TABLE 表名(
	列名 数据类型 DEFAULT 默认值,);

建完表后添加默认约束:

ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;

删除约束:

ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

7. 外键约束

当我们添加了外键以后,就在数据库层面建立了两张表的关系。

目的:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

添加约束:

CREATE TABLE 表名(
	列名 数据类型,[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);

建完表后添加外键约束:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

删除约束:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

7. 约束的案例练习

首先,我们使用以下的案例来练习约束:

-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int primary key, -- 编号 主键
name varchar(10)  not null unique, -- 姓名 非空,唯一
age int not null, -- 年龄 非空
gender varchar(5) not null, -- 性别 非空
math double(5,2) not null, -- 数学成绩  非空
english double(5,2) default 0 -- 英语成绩 默认为0
);

一文带你了解MySQL之约束

验证主键约束,其特点是非空且唯一,先添加一条数据:

insert into stu(id,name,age,gender,math,english) values(1,'小张',23,'男',66,78);

添加第二条数据时,尝试 id 添加为空值:

insert into stu(id,name,age,gender,math,english) values (null,'小李',20,'女',98,87);

一文带你了解MySQL之约束

尝试 id 添加为重复的值:

insert into stu(id,name,age,gender,math,english) values (1,'小陈',55,'男',56,77);

一文带你了解MySQL之约束我们已经验证了主键约束,当我们添加不合法的数据时,添加失败。

验证非空约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math,english) values (2,NULL,20,'女',76,65);

一文带你了解MySQL之约束
验证唯一约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math,english) values 
(5,'小张',20,'男',86,NULL);

一文带你了解MySQL之约束验证默认约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math) values (6,'小赵',23,'男',99);

一文带你了解MySQL之约束

验证外键约束:

我们使用一下的案例来验证外键约束:

-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);

此时,我们在员工表中添加了外键,相当于在数据库层面上建立了两张表的关系,此时如果员工表中有员工 a ,他属于 1 号部门,那么我们想要删除部门表中的 1 号部门就会删除失败,因为员工 a 是属于 1 号部门的,此时两张表建立了关系。

一文带你了解MySQL之约束添加数据:

-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','西安'),('销售部', '成都');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 20, 2);

此时想要是删除销售部门时,发现删除失败。

一文带你了解MySQL之约束文章来源地址https://www.toymoban.com/news/detail-469980.html

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

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

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

相关文章

  • 【MySQL】一文带你了解检索数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月09日
    浏览(50)
  • 【MySQL】一文带你了解数据过滤

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录

    2024年02月09日
    浏览(42)
  • 【MySQL】一文带你了解过滤数据

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录

    2024年02月09日
    浏览(50)
  • 一文带你了解MySQL之连接原理

    前言 我们搞数据库一个都避不开的概念就是 连接 ( join )。相信很多小伙伴初学连接的时候有些一脸懵,理解了连接的语义之后又可能搞不明白各个表中的记录到底是怎么连起来的,以至于在后期使用数据库的时候常常陷入下边两种误区: 误区一 :业务至上,不管三七二

    2024年02月05日
    浏览(63)
  • 【MySQL】一文带你彻底了解事务机制

    我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题: 数据库中途突然因为某些原因挂掉了。 客户端突然因为网络原因连接不上数据库了。 并发访问数据库时,多个线程同时写入数据库,覆盖了彼此的更改

    2024年02月09日
    浏览(40)
  • 【MySQL】一文带你了解MySQL的基础知识

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月08日
    浏览(50)
  • 【MySQL】一文带你了解MySQL中的子查询

    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入 。 SQL 中子查询的使用大大增强了 SELECT 查询的能力 ,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量

    2024年02月08日
    浏览(46)
  • 一文带你了解MySQL之undo日志

    我们在前边学习事务的时候说过事务需要保证 原子性 ,也就是 事务中的操作要么全做,要么全不做 。但是有的时候事务会出现一些情况,比如: 情况一: 事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误 情况二:程序

    2024年02月07日
    浏览(79)
  • 一文带你了解MySQL之redo日志

    前言 本文以及接下来的几篇文章将会频繁的使用到我们前边唠叨的 InnoDB记录行格式 、 页面格式 、 索引原理 、 表空间的组成 等各种基础知识,如果大家对这些东西理解的不透彻,那么阅读下边的文字可能会特别的些费力,为保证您能正常的理解,请确保自己已经掌握了我

    2024年02月08日
    浏览(45)
  • 一文带你了解MySQL之单表访问方法

    前言 对于我们这些 MySQL 的使用者来说, MySQL 其实就是一个软件,平时用的最多的就是 查询功能 。 DBA 时不时丢过来一些 慢查询语句 让优化,我们如果连查询是怎么执行的都不清楚还优化什么,所以是时候掌握真正的技术了。 我们在之前的文章的中,知道 MySQL Server 有一个

    2024年02月05日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包