【MySQL】表的约束

表的约束

一、介绍

  • 在MySQL中,表的约束是用于限制表中数据的规则,以确保数据的准确性和一致性。这些约束可以应用于单个列或多个列,也可以在创建表时或修改表时添加。
  • 约束有助于提高数据的完整性和一致性,但过多的约束可能会影响性能。
  • 表的约束的作用是让未来插入数据库表中的数据是符合预期的,即凡是插入进去的数据,都是符合数据约束的。最终目标是保证数据的完整性和可预期性。

二、空属性

1、介绍

  • 在MySQL中,空属性(NULL属性)是表约束和列属性中的一个重要概念,它用于指定某个字段是否可以接受空值(NULL)。它有两个值,分别是NULL和NOT NULL。
  • NULL,表示字段可以接受空值。在MySQL中,默认情况下,字段是允许为NULL的。空值表示字段没有值,它不同于0、空字符串("")或其他任何特定值。空值在数据库中通常用于表示未知或未提供的数据。
  • NOT NULL,表示字段不能接受空值。如果尝试将NULL值插入到具有NOT NULL约束的字段中,数据库将拒绝该操作并返回错误。

2、使用场景

  • 数据完整性:通过指定字段为NOT NULL,可以确保该字段在每条记录中都有值,从而维护数据的完整性。
  • 查询优化:在某些情况下,将字段设置为NOT NULL可以提高查询性能。因为数据库引擎在处理非空字段时可能更有效率。
  • 业务逻辑:根据业务逻辑需求,某些字段可能不允许为空。例如,订单表中的订单金额(order_amount)字段通常不允许为空,因为订单金额是订单的必要信息。

3、注意事项

  • 默认值:当字段被设置为NOT NULL且没有提供默认值时,在插入新记录时必须为该字段提供值。否则,数据库将返回错误。
  • 空值运算:在MySQL中,空值(NULL)不参与数学运算、字符串连接等大多数操作。任何与NULL进行的运算结果都将是NULL。
  • 索引和约束:在某些情况下,将字段设置为NOT NULL可能有助于创建索引和约束。例如,主键和唯一约束通常要求字段不能为NULL。

4、示例

sql 复制代码
CREATE TABLE example_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NULL
);
  • name字段被设置为NOT NULL,而email字段被设置为NULL。

三、默认值约束(DEFAULT)

  • 在MySQL中,默认值约束(Default Constraint)是一种用于指定字段默认值的规则。当向表中插入新记录而未为该字段指定值时,系统会自动为该字段赋予默认值。
  • 数据类型支持:并非所有数据类型都支持默认值约束。例如,BLOB和TEXT数据类型就不支持默认值约束。
  • NULL值处理:如果字段被设置为允许NULL值(即没有非空约束),并且插入了NULL值,那么默认值将不会被使用。只有当字段没有插入任何值时(包括没有显式插入NULL值),默认值才会被赋予。但default和NOT NULL不冲突,而是互相补充的。
  • 优先级:如果用户为字段指定了具体的值,那么该值将覆盖默认值,即用户指定的值具有更高的优先级。

四、列描述(COMMENT)

1、介绍

  • 在MySQL中,列描述(Column Description)通常指的是对表中各个字段(列)的详细说明和注释。这些描述有助于数据库管理员、开发人员和其他用户更好地理解表结构以及每个字段的用途和含义。即列描述是一种重要的文档化工具,有助于提高数据库的可读性、维护性和易用性。通过合理使用列描述,可以更好地理解和使用数据库表结构。

2、注意事项

  • 描述内容:列描述应简洁明了,避免使用过长或复杂的语句。
  • 一致性:在数据库中,应保持列描述的一致性和准确性,以便于其他用户理解和使用。

3、示例



五、ZEROFILL

1、介绍

  • ZEROFILL是一种用于在数字字段上进行填充零的属性。通常用于为了确保数字达到指定长度时,左侧用零进行填充。
  • ZEROFILL属性仅影响数字的显示方式,不影响其存储方式。即存储的数据仍然是实际的整数值,只有在检索数据时才会被填充零。
  • 使用ZEROFILL属性时,列的数据类型通常应为整数类型,如INT、SMALLINT、BIGINT等。
  • 如果插入的数字长度超过了指定的显示宽度,MySQL会按照实际长度存储和显示该数字,而不会进行截断。

2、应用场景

  • 标识符填充:在需要保持标识符固定长度的场景下,比如订单编号、产品编号等。
  • 对齐要求:当在表格或报告中需要数字对齐时,ZEROFILL属性可以确保数字始终占据相同的字符宽度。
  • 数据整齐性:用于提高数据整齐性,方便人工查看和处理。

3、示例

sql 复制代码
create table t12(
a int unsigned,
b int unsigned zerofill
);



六、主键约束(PRIMARY KEY)

1、介绍

  • 主键约束是一种用于唯一标识表中每一行数据的约束。它可以确保表中的每一行数据都是唯一的(避免数据重复),并且不允许包含NULL值(因为NULL值无法唯一标识一行数据)。
  • 通常,主键列会设置为自动递增(AUTO_INCREMENT),这样每次插入新行时,主键列的值都会自动增加,无需手动指定,但需要注意AUTO_INCREMENT属性只能用于整数类型的列。
  • 主键约束会自动创建一个唯一索引,以提高查询效率。每个表只能有一个主键约束,但主键约束可以由一个或多个列组成,即联合主键,或称为复合主键。
  • 在数据库设计中,主键通常用于与其他表建立关联关系(外键约束)。

2、语法

sql 复制代码
CREATE TABLE your_table (
    column1 datatype PRIMARY KEY,
    column2 datatype,
    ...
);

ALTER TABLE your_table
ADD PRIMARY KEY (column1);


CREATE TABLE your_table (
    column1 datatype,
    column2 datatype,
    ...
    PRIMARY KEY (column1, column2)
);

ALTER TABLE your_table
ADD PRIMARY KEY (column1, column2);

3、示例

sql 复制代码
create table t13(
id int primary key,
name varchar(20)
);


sql 复制代码
alter table t13 drop primary key;
desc t13;
sql 复制代码
alter table t13 add primary key(id);
desc t13;

复合主键

sql 复制代码
create table t14(
id int,
course_id varchar(10),
name varchar(20),
primary key(id, course_id)
);
desc t14;


七、自动递增约束(AUTO_INCREMENT)

1、介绍

  • 自动递增(AUTO_INCREMENT)约束用于在表中生成唯一的数值,通常用于主键(PRIMARY KEY)字段。这个约束确保了每次插入新记录时,该字段的值会自动增加,从而避免了手动插入重复值的问题。
  • 每个表只能有一个AUTO_INCREMENT字段,它通常是整数类型(如INT、BIGINT)。并且,AUTO_INCREMENT字段的值在删除记录后不会重置,除非手动重置。
  • 如果手动为AUTO_INCREMENT字段指定了一个值,该值必须大于当前最大的自动递增值,否则会导致错误。

2、示例

sql 复制代码
create table t15(
id int unsigned primary key auto_increment,
name varchar(20)
);

insert into t15 (name) values ('薛宝钗');
insert into t15 (name) values ('贾政');

select * from t15;
  • 添加auto_increment的列不加primary key 时报错

八、LAST_INSERT_ID

1、介绍

  • LAST_INSERT_ID是MySQL中的一个内置函数,它返回最近一次向具有AUTO_INCREMENT属性的列插入数据时生成的自增ID值。
  • LAST_INSERT_ID函数的返回值是基于每个连接的。这意味着在不同的连接中,调用LAST_INSERT_ID函数将返回不同的值。
  • 如果在一个事务中进行了多次插入操作,那么每次调用LAST_INSERT_ID函数都将返回最后一次插入操作的ID值。
  • 如果在插入操作中没有使用自增主键,那么调用LAST_INSERT_ID函数将返回0。
  • 如果在SQL中显式指定了自增字段的值,那么LAST_INSERT_ID获取到的值将为0。只有当自增字段由MySQL来分配时,LAST_INSERT_ID才能得到正确的值。
  • 若在同一条INSERT语句中插入多行,LAST_INSERT_ID返回的值只是这些行中第一个生成的自增值,而不是所有生成的自增值。

2、示例

  • 本例是在上方示例的基础上执行的。
sql 复制代码
select last_insert_id();
sql 复制代码
desc t15;

九、唯一约束(UNIQUE)

1、介绍

  • 唯一约束用于保证数据表中字段的唯一性,即表中字段的值不能重复出现。它确保表中特定列的值不重复,如果尝试插入或更新违反唯一约束的数据,数据库会拒绝这些操作并返回错误,从而维护数据的完整性和一致性。
  • 唯一约束允许特定列上存在NULL值。但如果多个空值被视为不同值(在大多数数据库系统中是这样),则它们可以在唯一约束列中共存。
  • 唯一约束可以应用于单个列,也可以应用于多个列的组合。在后者的情况下,只有当多个字段的值都相同时,才视为重复记录。
  • 在某些情况下,表中的主键可能由多列组成。如果某些列的组合能够唯一标识表中的每一行,但不是每一列单独标识行,那么可以使用唯一约束来替代主键。这样可以减少主键的复杂性,提高查询效率。
  • 唯一约束可以加速查询操作,特别是在涉及到唯一约束列的查找或连接时。数据库系统可以利用唯一索引来快速定位满足条件的行。

2、与主键约束的区别

  • 唯一性要求:两者都要求列中的值唯一,但唯一约束允许空值,而主键约束不允许有空值。
  • 索引类型:在默认情况下,主键约束产生聚集索引,而唯一约束产生非聚集索引。聚集索引决定了表中数据的物理存储顺序,而非聚集索引则不改变数据的物理存储顺序。
  • 数量限制:一张表只能有一个主键约束,但可以有多个唯一约束。

3、示例

sql 复制代码
create table t16(
id int unique key comment '学号',
name varchar(10)
);

desc t16;


sql 复制代码
insert into t16 (name) values('张三');

insert into t16 (id, name) values(12, '李四');

select * from t16;

十、外键约束(FOREIGN KEY)

1、介绍

  • 外键约束是用来在两个表的数据之间建立链接的一种机制,即在一个表中定义的列,这个列将引用另外一个表中的列。这种关联关系可以确保数据的完整性和一致性。
  • 外键是表的一个字段,不是本表的主键,但对应另一个表的主键。

2、作用

  • 维护数据完整性:外键约束可以确保引用表中的数据与被引用表中的数据之间的一致性,防止引用表中插入无效的引用值。
  • 建立关联关系:外键约束允许在两个表之间建立关联关系,这种关联关系可以用于检索和操作相关联的数据。
  • 防止数据不一致:外键约束可以防止在引用表中删除或更新被引用表中的数据时导致数据不一致的情况发生。

3、创建条件

  • 父表必须存在:对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),且父表必须已经存在于数据库中,或者是当前正在创建的表。
  • 主键和外键数据类型一致:外键列必须与关联表的主键列类型相同。
  • InnoDB存储引擎:两个表必须都使用InnoDB存储引擎,因为外键约束在MyISAM等存储引擎中是不被支持的。

4、类型

  • 单列外键约束:外键关联的字段只有一个,它通常用于建立单一字段的关联关系。
  • 复合外键约束:外键关联的字段有多个,它用于建立多个字段的组合关联关系。
  • 自引用外键约束:一个表中的外键关联到该表中的另一个字段,通常用于表示层次结构关系。
  • 级联外键约束:在外键操作时会自动执行相应的级联操作,如级联删除或更新。

5、注意事项

  • 性能影响:外键约束可能会对性能产生一定影响,特别是在执行大量的插入、更新和删除操作时。
  • 级联操作:当使用级联操作时,要特别小心,确保其不会导致意外的数据删除或更新。
  • 索引维护:外键约束通常需要创建索引来加速引用表的查找操作。这些索引需要维护,因此在插入、更新和删除操作时会导致额外的开销。
  • 命名冲突:如果为外键约束指定了一个名称,请确保该名称在数据库中唯一。

6、语法

(1)语法

sql 复制代码
CREATE TABLE 子表名 (
    列名1 数据类型 [约束条件],
    列名2 数据类型 [约束条件],
    ...
    [CONSTRAINT 外键约束名] FOREIGN KEY (子表外键列) REFERENCES 父表(父表主键列)
    [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT | SET DEFAULT}]
    [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT | SET DEFAULT}]
);

ALTER TABLE 子表名
ADD CONSTRAINT 外键约束名 FOREIGN KEY (子表外键列) REFERENCES 父表(父表主键列)
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT | SET DEFAULT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT | SET DEFAULT}];

ALTER TABLE 子表名
DROP FOREIGN KEY 外键约束名;

(2)说明

  • 第一部分为在创建表时定义外键约束,第二部分为在修改表时添加外键约束,第三部分为删除外键约束。
字段 意义
子表名 要创建的表的名称
列名1..., 列名2..., ... 表中的列及其数据类型和约束条件
[CONSTRAINT 外键约束名] 可选的,为外键约束指定一个名称。如果不指定,MySQL会自动生成一个名称
子表外键列 子表中用于建立外键关系的列
父表 已经存在的、包含主键的表
父表主键列 父表中用于与外键列建立关联的主键列
[ON DELETE {...}] 可选的,定义当父表中的行被删除时,子表中的外键列应如何响应
[ON UPDATE {...}] 可选的,定义当父表中的主键值被更新时,子表中的外键列应如何响应

7、示例

sql 复制代码
create table class(
id int primary key,
name varchar(30)
);
create table student(
id int primary key comment '学号',
name varchar(20) comment '姓名',
class_id int comment '班级号',
foreign key (class_id) references class(id)
);
sql 复制代码
insert into class values (123, '高一一班');
insert into class values (456, '高二二班');
insert into class values (789, '高三三班';
select * from class;
sql 复制代码
insert into student values(147, '贾宝玉', 123);
insert into student values(258, '林黛玉', 789);

本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信

本文只是在学习过程中所做的总结,不会涉及过深的概念

创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下💕💕💕

相关推荐
爱学习的小囧1 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
NCIN EXPE1 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台1 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路1 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家1 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE1 小时前
开启mysql的binlog日志
数据库·mysql
坚持就完事了1 小时前
Linux中的变量
linux·运维·服务器
yejqvow121 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
handler011 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
oLLI PILO1 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库