0


MySQL - 六大约束看这一篇就够了主键、外键、唯一、检查、默认值、非空六大约束

文章目录

约束

在 MySQL 中,约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。

例如,在数据表中存放年龄的值时,如果存入 200、300以及一些负数这些无效的值就毫无意义了。因此,使用约束来限定表中的数据范围是很有必要的。

主键约束

主键约束是使用最频繁的约束。是MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。

主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。例如,学生信息表中的学号是唯一的。

主键分为两种类型:单主键和联合主键。

这里需要声明一下,每张表只能有一个主键,如果想将多个字段设置为主键,可以将这些字段联合,设置联合主键。不能够将多个字段设置为主键,下面的内容会进行详细的展示说明。联合主键不是多主键!!!

使用主键应注意以下几点:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
  • 一个字段名只能在联合主键字段表中出现一次。
  • 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

这里的最小化原则是在一张表中,满足主键的要求的情况下,尽量使得联合主键中的字段数最小。

  1. 创建表时设置主键约束
  • 单主键的设置
CREATE TABLE table_name (
    id int PRIMARY KEY,
    `name` varchar(32),
    salary float
);

该语句的功能时在创建数据表的时候,将

id

字段设置为了主键。直接在字段后使用

PRIMARY KEY

关键词,即将

id

字段设置为主键约束,也可以使用下面介绍的联合主键的方法,只在字段中输入一个字段名称即可。

  • 联合主键的设置
CREATE TABLE table_name (
    id int,
    `name` varchar(32),
    salary float,
    PRIMARY KEY(id,`name`)
);

该语句的功能是在创建数据表的时候,将

id

,

name

字段设置为了联合主键,在设置完字段后,使用

PRIMARY KEY

在参数内填写需要设置联合主键的字段名称。即可设置联合主键。

  1. 修改表时添加主键约束
ALTER TABLE table_name ADD PRIMARY KEY(field_name1,field_name2...);

该语句是在修改数据表的时候添加主键约束,这里如何字段名只有一个,那么就添加的是单主键,多个字段即为联合主键。

  1. 删除主键约束
ALTER TABLE table_name DROP PRIMARY KEY;

该语句是删除表中的主键约束。

外键约束

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。

主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
  1. 创建表时设置外键
# 创建部门表,即为主表
CREATE TABLE table_name_dept(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,    # 部门 ID
    `name` VARCHAR(32),        # 部门 名称
    location VARCHAR(32)    # 部门 位置
);

# 创建员工表
CREATE TABLE table_name_emp(
    id INT(11),
    `name` VARCHAR(32),        # 员工名称
    depId VAECHAR(32),        # 员工部门ID
    salary FLOAT,            # 员工薪资
    CONSTRAINT fk_emp_dept1 # 设置外键名称
    FOREIGN KEY(id) REFERENCES table_name_dept(id)    # 设置外键
);

该语句的功能是创建了两张表,首先创建员工部门表,并且设置id为主键并且自增长,第二张员工表设置的了名称为

fk_emp_dept1

的外键,其关联的是两张表,是用两张表中的两个字段,table_name_dept表中的

id

字段和table_name_emp中的

id

字段进行联立。需要用来联立的字段的数据类型必须一致,否则会报错

Can't create table

错误。

  1. 修改表时设置外键

外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

ALTER TABLE table_name ADD 
    CONSTRAINT foreign_key_name 
    FOREIGN KEY(id) REFERENCES table_name_main(field_name);

该语句的功能是向已经创建好的数据表中增加外键,其数据表名为

table_name

外键名为

foreign_key_name

设置的外键字段名为

id

,联立的字段是

field_name

id

。在增加外键的时候,表中外键列中的数据必须和主表中的主键列数据一致,或者是没有数据。

  1. 删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

ALTER TABLE table_name DROP CONSTRAINT foreign_key_name;

删除外键约束,解除了主表和从表之间的关系。

唯一约束

MySQL唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。

唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。

  1. 创建表时设置唯一约束

在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法格式如下:

CREATE TABLE table_name(
    id INT PRIMARY KEY,
    `username` VARCHAR(32) UNIQUE,
    `password` VARCHAR(32)
);

该语句是在创建数据表时设置唯一约束,一张表中可以有多个唯一约束,而且允许为空,但只允许一行数据为空。

  1. 在修改表时添加唯一约束
ALTER TABLE table_name ADD CONSTRAINT (unique_name) UNIQUE (field_name)

该语句的功能时在修改表的时候添加一个名为

unique_name

的约束,约束字段为

field_name

;

  1. 删除表中的唯一约束
ALTER TABLE table_name DROP INDEX (unique_name);

需要注意的是这里使用约束名删除约束的时候使用的关键词不是

CONSTRAINT

而是

INDEX

检查约束

检查约束是用来检查数据表中,字段值是否有效的一个手段。

例如,学生信息表中的年龄字段是没有负数的,并且数值也是有限制的。如果是大学生,年龄一般应该在 18~30 岁之间。在设置字段的检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。

MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。

默认值约束和非空约束也可看作是特殊的检查约束。

  1. 在创建表时设置检查约束
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    `name` VARCHAR(32),
    age INT(3),
    CHECK (age >= 0 AND age <= 200)    # 检查约束的设置
);

该语句的功能时设置检查约束,将age字段的值设置在 [0,200]之间,只有在这个范围内的值才是合法的值。

  1. 在修改表时设置检查约束
ALTER TABLE table_name ADD CONSTRAINT check_constraint_name CHECK (check_sql);
  1. 删除表中的检查约束
ALTER TABLE table_name DROP CONSTRAINT check_constraint_name;

非空约束

非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。

比如,在用户信息表中,如果不添加用户名,那么这条用户信息就是无效的,这时就可以为用户名字段设置非空约束。

  1. 在创建表时设置非空约束
CREATE TABLE table_name (
    id INT PRIMARY KEY,
    `name` VARCHAR(32) NOT NULL,
    age INT(3)
);
  1. 在修改表时添加非空约束
ALTER TABLE table_name CHANGE COLUMN field_name 
            field_name data_type NOT NULL;
  1. 删除非空约束
ALTER TABLE <数据表名> CHANGE COLUMN field_name
            field_name data_type NULL;

默认值约束

默认值(Default)的完整称呼是”默认值约束(Default Constraint)”,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。

例如,员工信息表中,部门位置在北京的较多,那么部门位置就可以默认为“北京”,系统就会自动为这个字段赋值为“北京”。

默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。

  1. 在创建表时设置默认值约束
CREATE TABLE table_name(
    id INT PRIMARY KEY,
    `name` VARCHAR(32),
    `local` VARCHAR(32) NOT NULL DEFAULT "北京"
);

默认值为字符类型时需要用引号引起来。

  1. 在修改表时添加默认值约束
ALTER TABLE table_name CHANGE COLUMN field_name
            field_name data_type DEFAULT defult_value;
  1. 删除默认值约束
ALTER TABLE table_name CHANGE COLUMN field_name 
            field_name data_type DEFAULT NULL;

主键自增长

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

通过给字段添加

AUTO_INCREMENT

属性来实现主键自增长。语法格式如下:

字段名 数据类型

AUTO_INCREMENT
  • 默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1。
  • 一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  • AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性。
  • AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
  • AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。
  1. 创建表时设置主键自增长
CREATE TABLE table_name (
    id int PRIMARY KEY AUTO_INCREMENT,
    `name` varchar(32),
    salary float
);

该语句的功能为在创建名为

table_name

的数据表中,设置字段

id

为主键,并且设置主键自增长。

  1. 指定自增字段初始值
CREATE TABLE table_name (
    id int PRIMARY KEY AUTO_INCREMENT,
    `name` varchar(32),
    salary float
    ) AUTO_INCREMENT = 100;
);

该语句的功能为在创建名为

table_name

的数据表中,设置字段

id

为主键,并且设置主键自增长。设置了主键自增长的默认值为100。

  1. 自增字段值不连续

需要注意的是,设置了主键自增长,虽然主键是按照相同的步长值进行连续增长,但是实际上主键自增长的字段不一定是连续的,这里将这种情况进行解释和说明。

# 创建数据表,并且设置主键和自增长 和唯一约束
CREATE TABLE table_name (
    id int PRIMARY KEY AUTO_INCREMENT,
    `name` varchar(32) UNIQUE KEY,
    salary float
);
# 插入一条数据
INSERT INTO table_name VALUES(1,1,1);

# 插入第二条数据
INSERT INTO table_name VALUES(null,1,1);

语句解释:第一条语句为创建数据表,并且设置相关的约束。在插入第一条数据时,因为数据表中没有数据,所以会插入成功。到第二条数据插入时,因为由唯一约束的存在,

name

字段的值不能够重复,这个时候就会插入失败,此时虽然没有将数据插入成功,但是自增主键的id已经进行自增,此时数据表中仍只有一条数据,而其主键id值为1,再进行插入数据时,这个时候的id就已经是3了。这样就出现了主键自增不连续的现象。

小结

  • 以上 6 种约束中,一个数据表中只能有一个主键约束,其它约束可以有多个。
  • 在外键的创建时,必须先创建主表,再才能创建从表,因为创建从表需要用到主表。
  • 外键的添加需要满足从表中的字段数据全部出现在主表中的字段值。
  • 默认值约束和非空约束可以看做是一种检查约束
  • 自增字段会出现不连续的情况。
标签: mysql 数据库 约束

本文转载自: https://blog.csdn.net/qq_33685334/article/details/123485615
版权归原作者 多功能人 所有, 如有侵权,请联系我们删除。

“MySQL - 六大约束看这一篇就够了主键、外键、唯一、检查、默认值、非空六大约束”的评论:

还没有评论