欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL常见约束详解

程序员文章站 2022-05-01 20:01:07
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性六大约束NOT NULL :非空,用于保证该字段的值不能为空DEFAULT:默认,用于保证该字段有默认值PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空UNIQUE:唯一,用于保证该字段的值唯一,可以为空,比如座位号CHECK:检查约束,MySQL不支持,比如年龄和性别,不满足要求则不能插入FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值;再从表添加外键约...

含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性
六大约束

  • NOT NULL :非空,用于保证该字段的值不能为空
  • DEFAULT:默认,用于保证该字段有默认值
  • PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
  • UNIQUE:唯一,用于保证该字段的值唯一,可以为空,比如座位号
  • CHECK:检查约束,MySQL不支持,比如年龄和性别,不满足要求则不能插入
  • FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值;再从表添加外键约束,引用主表中 关联列的值
    注意:unique约束虽然可以为空,由于它本身要求唯一,所以表中只允许有一个null

约束分为

  • 列级约束
    六大约束语法上都支持,但是外键和检查约束没有效果
  • 表级约束、
    除了非空和默认约束,其他的约束都支持

添加约束的时机:创建表时和修改表时
CREATE TABLE 表名(
字段名 类型名 列级约束,
字段名 类型名 列级约束,
表级约束
);

一、创建表时添加约束

添加列级约束案例:

CREATE TABLE stuinfo(
	id INT PRIMARY KEY,  #主键约束
	stuName VARCHAR(20) NOT NULL DEFAULT ‘John’,   #非空和默认约束
	gender CHAR(1) CHECK(gender IN ('男','女')),  #检查约束,MySQL不支持
	seat INT UNIQUE,  #唯一约束
	age INT DEFAULT 18,  #默认约束
	majorId INT REFERENCES major(id)  #外键约束,无效
);

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARIANCE(20)
);

添加表级约束案例:

CREATE TABLE stuinfo(
	id INT, 
	stuName VARCHAR(20),
	gender CHAR(1) , 
	seat INT, 
	age INT, 
	majorId INT,
	CONSTRAINT pk PRIMARY KEY(id),  #主键约束
	CONSTRAINT uq UNIQUE(seat),  #唯一约束
	CONSTRAINT ck CHECK(gender IN ('男','女')),  #检查约束
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)  #外键约束
);
#如果需要组合主键:PRIMARY KEY(id,其他字段名,...)

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARIANCE(20)
);

创建表及其约束的通用写法:

CREATE TABLE stuinfo(
	id INT PRIMARY KEY,  #主键约束
	stuName VARCHAR(20) NOT NULL,   #非空约束
	gender CHAR(1) CHECK(gender IN ('男','女')),  #检查约束,MySQL不支持
	seat INT UNIQUE,  #唯一约束
	age INT DEFAULT 18,  #默认约束
	majorId INT,
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)  #外键约束
);

CREATE TABLE major(
	id INT PRIMARY KEY,
	majorName VARIANCE(20)
);

查看表中所有的索引,包括主键,外键,唯一
SHOW INDEX FROM stuinfo;

主键和唯一的大对比(经典面试题):

保证唯一性 是否允许为空 一个表中可以有多个 是否允许组合
主键 × 最多1个 √,但不推荐
唯一 可以有多个 √,但不推荐

外键的注意事项:
1.外键引用的主表关联列必须是一个key(主键或唯一都可以)
2.插入数据是应该先插入主表的数据,在插入从表的数据
3.删除表数据时,应该先删除从表的数据,再删除主表的数据

二、修改表时添加约束

#添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;

#添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

#添加主键列级约束
ALTER TABLE stuinfo MODIFY COLUMN ID INT PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#添加唯一列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);

#添加级联删除外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) ON DELETE CASCADE;
#添加级联置空外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) ON DELETE SET NULL;

三、修改表时删除约束


#删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;

#删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#删除主键列级约束
ALTER TABLE stuinfo DROP PRIMARY KEY;

#删除唯一约束
ALTER TABLE stuinfo DROP INDEX seat;

#删除外键
ALTER TABLE stuinfo DROP  FOREIGN KEY fk_stuinfo_major;

标识列

标识列又称为自增长列,关键词AUTO_INCREMENT

  • 一个表至多一个标识列,而且必须和key(主键、外键、唯一)搭配
  • 标识列只能是数值型(整形,浮点型)
  • 标识列可以通过SET auto_increment_increment=3;设置步长;可以通过手动插入值,设置起始值。

在创建表和修改表时都可以使用标识列。

本文地址:https://blog.csdn.net/weixin_44237240/article/details/108980101

相关标签: 数据库 mysql