一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
写在前面👀
约束(Constraints)的作用:对表中的数据进行限制,保证数据的正确性、有效性和完整性性。一个表如果添加了约束,不正确的数据将无 法插入到表中。约束在创建表的时候添加比较合适。
1️⃣约束种类🍕
| 约束关键字 | 作用 |
|---|---|
| PRIMARY KEY | 主键 ,唯一且非空,一个表只能有一个主键 |
| UINQUE | 唯一 ,字段值不能有重复,可以为NULL,一个表中能有多个唯一 |
| NOT NULL | 非空 ,字段值不能为NULL |
| FOREIGN KEY | 外键,主表中主键列,在从表中外键列 |
| DEFAULT | 默认,若不输入值,则自动添加字段默认值 |
| check (mysql 不支持) | 检查约束 |
- 列级约束:
NOT NULL|DEFAULT|PRIMARY KEY|UNIQUE - 表级约束:
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.删除操作对自增的影响🍿
DELETE:删除所有的记录之后,自增长没有影响。
/* 示例 */
DELETE FROM stu;
INSERT INTO stu (name,age,sex) VALUES ('张宇莹',18,'女'),('郭萍萍',19,'女'),('柳正盈',20,'女'),('胡颖昕',19,'女'),('王一惠',18,'女'),('郦志航',18,'男');
SELECT * FROM stu;
- 演示结果如下👇
TRUNCATE:删除以后,自增长又重新开始,而且起始值变为默认1
/* 示例 */
TRUNCATE TABLE stu;
INSERT INTO stu (name,age,sex) VALUES ('张宇莹',18,'女'),('郭萍萍',19,'女'),('柳正盈',20,'女'),('胡颖昕',19,'女'),('王一惠',18,'女'),('郦志航',18,'男');
SELECT * FROM stu;
- 演示结果如下👇
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.几个概念
主表: 一方,用来约束别人的表从表: 多方,被别人约束的表外键:在从表中与主表主键(或UNIQUE)对应的那一列外键约束名称:推荐命名格式👉👉从表名_外键字段名_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);
- 在对象窗口选中两张表,右键-->逆向表到模型
- 可以看到stu表和department表已经关联在一起了
2.一些规定
- 主表可以约束从表,从而保持两表数据的一致性,所以外键约束需要遵循以下规定👇
- 外键可以重复以及允许为空,
从表的外键关联主表的主键或UNIQUE - 一张表只能有一个主键,但可以有多个外键
- 从表的外键和主表的关联列
数据类型一致或兼容 - 主表和从表的编码方式和所用数据库引擎(InnoDB)需一致
- 创建先创建父表,插入数据先插入父表数据,删除数据先删除子表数据
- 外键可以重复以及允许为空,
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];
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗