MySQL约束条件

143 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

写在前面👀

约束(Constraints)的作用:对表中的数据进行限制,保证数据的正确性、有效性和完整性性。一个表如果添加了约束,不正确的数据将无 法插入到表中。约束在创建表的时候添加比较合适。

1️⃣约束种类🍕

约束关键字作用
PRIMARY KEY主键 ,唯一且非空,一个表只能有一个主键
UINQUE唯一 ,字段值不能有重复,可以为NULL,一个表中能有多个唯一
NOT NULL非空 ,字段值不能为NULL
FOREIGN KEY外键,主表中主键列,在从表中外键列
DEFAULT默认,若不输入值,则自动添加字段默认值
check (mysql 不支持)检查约束
  1. 列级约束:NOT NULL | DEFAULT | PRIMARY KEY | UNIQUE
  2. 表级约束:PRIMARY KEY | UNIQUE | FOREIGN KEY
/* 语法 */
CREATE TABLE 表名(
    字段名 字段类型 列级约束,
    字段名 字段类型,
    CONSTRAINT 约束别名 表级约束
  )

2️⃣主键约束🍔

主键:PRIMARY KEY,用来唯一标识数据库中的每一条记录

1.主键操作🍟

/* 语法 */
-- 在创建表的时候给字段添加主键
字段名 字段类型 PRIMARY KEY;
-- 在已有表(该表没有主键)中添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
-- 删除表中的主键
ALTER TABLE 表名 DROP PRIMARY KEY;

2.主键自增🌭

  • 关键字:AUTO_INCREMENT,默认起始值是1
  • **注意:**主键自增的字段类型必须是整数类型
  • 主键字段设置自增后,用INSERT INTO添加数据时不需要写主键字段名了
/* 语法 */
-- 创建表时指定起始值
CREATE TABLE 表名(
列名 INT PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT=起始值;
-- 创建好以后修改起始值
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
/* 示例 */
-- 学号从2103030101开始自增
CREATE TABLE stu (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(10) DEFAULT "",
	age INT DEFAULT 0,
	sex VARCHAR(10) DEFAULT "男"
)AUTO_INCREMENT=2103030101;

3.删除操作对自增的影响🍿

  1. DELETE:删除所有的记录之后,自增长没有影响。
/* 示例 */
DELETE FROM stu;
INSERT INTO stu (name,age,sex) VALUES ('张宇莹',18,'女'),('郭萍萍',19,'女'),('柳正盈',20,'女'),('胡颖昕',19,'女'),('王一惠',18,'女'),('郦志航',18,'男');
SELECT * FROM stu;
  • 演示结果如下👇image-20220408213741636
  1. TRUNCATE:删除以后,自增长又重新开始,而且起始值变为默认1
/* 示例 */
TRUNCATE TABLE stu;
INSERT INTO stu (name,age,sex) VALUES ('张宇莹',18,'女'),('郭萍萍',19,'女'),('柳正盈',20,'女'),('胡颖昕',19,'女'),('王一惠',18,'女'),('郦志航',18,'男');
SELECT * FROM stu;
  • 演示结果如下👇image-20220408214135414

3️⃣唯一约束🧂

关键字:UNIQUE,表中某一列不能出现重复的值

/* 语法 */
字段名 字段类型 UNIQUE;
/* 示例 */
-- 某网站注册用户不能重名
CREATE TABLE user (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(10) UNIQUE,
);

4️⃣ 非空约束🥓

关键字:NOT NULL,某一列不能为 NULL。

/* 语法 */
字段名 字段类型 NOT NULL
/* 示例 */
-- 某网站注册用户不能为空且不能重复
CREATE TABLE user (
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(10) NOT NULL UNIQUE
);

5️⃣默认约束🥚

关键字:DEFULT,若不输入值,则自动添加字段默认值

/* 语法 */
字段名 字段类型 DEFAULT 默认值
/* 示例 */
-- 性别默认是男
CREATE TABLE student(
id INT,
gender ENUM('male','female') DEFAULT 'male'
)

6️⃣外键约束🍳

关键字:FOREIGN KEY,用来解决数据冗余,方便数据的管理,来维护两个表之间数据的一致性

1.几个概念

  1. 主表: 一方,用来约束别人的表
  2. 从表: 多方,被别人约束的表
  3. 外键:在从表中与主表主键(或UNIQUE)对应的那一列
  4. 外键约束名称:推荐命名格式👉👉从表名_外键字段名_fk
/* 语法 */
-- 新建表时增加外键
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
-- 已有表增加外键
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
-- 删除外键
ALTER TABLE 从表 DROP FOREIGN KEY [外键约束名称];
/* 示例 */
-- 创建主表:department部门表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT, # 主表的主键
	dep_name varchar(20) NOT NULL,     # 部门名称
	dep_location varchar(20) NOT NULL  # 部门地址
);
-- 创建从表:stu学生表
CREATE TABLE stu(
	id INT PRIMARY KEY AUTO_INCREMENT, # 从表的主键
	name VARCHAR(10) DEFAULT "",	   # 学生姓名
	age INT DEFAULT 0,				   # 学生年龄
	sex ENUM("男","女") DEFAULT "男",   # 学生性别
	dep_id INT(11) NOT NULL            # 从表的外键对应主表的主键
)AUTO_INCREMENT=2103030101;
-- 添加外键,关联两表
ALTER TABLE stu ADD CONSTRAINT stu_depid_fk FOREIGN KEY (dep_id) REFERENCES department(id);
  • 在对象窗口选中两张表,右键-->逆向表到模型

image-20220409114609941

  • 可以看到stu表和department表已经关联在一起了 image-20220409114557804

2.一些规定

  • 主表可以约束从表,从而保持两表数据的一致性,所以外键约束需要遵循以下规定👇
    1. 外键可以重复以及允许为空,从表的外键关联主表的主键或UNIQUE
    2. 一张表只能有一个主键,但可以有多个外键
    3. 从表的外键和主表的关联列数据类型一致或兼容
    4. 主表和从表的编码方式和所用数据库引擎(InnoDB)需一致
    5. 创建先创建父表,插入数据先插入父表数据,删除数据先删除子表数据

3.级联操作

  • 一般情况下,主表从表关联后,主表的主键不可以再变了。当我们需要删除主表信息 时,必须先删除从表中关联的数据,很麻烦。级联操作就能在操作主表时,自动的操作从表。
级联操作分类作用
ON UPDATE CASCADE在更新父表中的数据时候,级联更新子表中的数据
ON DELETE CASCADE在删除父表中的数据的时候,级联删除子表中的数据
/* 语法 */
-- 新建表时添加级联操作
[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) [ON UPDATE CASCADE] [ON DELETE CASCADE];
-- 已有表增加外键
ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名)[ON UPDATE CASCADE] [ON DELETE CASCADE];

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗