MySQL 约束
最后修改于 2023 年 1 月 10 日
在本 MySQL 教程中,我们将学习约束。
约束 放置在列或表上。它们限制了可以插入到表中的数据。
我们有以下约束
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- ENUM
- SET
其他数据库也有 CHECK 约束,它对有效数据设置一个条件。MySQL 解析此约束,但未强制执行。
NOT NULL 约束
具有 NOT NULL 约束的列不能有 NULL 值。
mysql> CREATE TABLE People(Id INTEGER, LastName TEXT NOT NULL,
-> FirstName TEXT NOT NULL, City VARCHAR(55));
Query OK, 0 rows affected (0.07 sec)
我们创建了两个具有 NOT NULL 约束的列。
mysql> INSERT INTO People VALUES(1, 'Hanks', 'Robert', 'New York'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO People VALUES(1, NULL, 'Marianne', 'Chicago'); ERROR 1048 (23000): Column 'LastName' cannot be null
第一个 SELECT 语句执行 OK,第二个语句失败。SQL 错误说,LastName 列不能为 null。
UNIQUE 约束
UNIQUE 约束确保所有数据在列中是唯一的。
mysql> CREATE TABLE Brands(Id INTEGER, BrandName VARCHAR(30) UNIQUE); Query OK, 0 rows affected (0.08 sec)
在这里,我们创建了一个名为 Brands 的表。BrandName 列设置为 UNIQUE。不能有两个品牌具有相同的名称。
mysql> INSERT INTO Brands VALUES(1, 'Coca Cola'); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO Brands VALUES(2, 'Pepsi'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO Brands VALUES(3, 'Pepsi'); ERROR 1062 (23000): Duplicate entry 'Pepsi' for key 'BrandName'
我们得到一个 SQL 错误 Duplicate entry 'Pepsi' for key 'BrandName'。只能有一个百事品牌。
请注意,PRIMARY KEY 约束会自动在其上定义 UNIQUE 约束。
主键
PRIMARY KEY 约束唯一标识数据库表中的每条记录。它是唯一键的特殊情况。主键不能为 NULL,唯一键可以为 NULL。可以有多个 UNIQUE 列,但表中只有一个主键。主键在设计数据库表时很重要。主键是唯一的 ID。我们使用它们来引用表行。在创建表之间的关系时,主键成为其他表中的外键。
mysql> DROP TABLE Brands; mysql> CREATE TABLE Brands(Id INTEGER PRIMARY KEY, BrandName VARCHAR(30) UNIQUE);
Brands 表的 Id 列成为主键。
mysql> DESCRIBE Brands; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Id | int(11) | NO | PRI | NULL | | | BrandName | varchar(30) | YES | UNI | NULL | | +-----------+-------------+------+-----+---------+-------+
DESCRIBE 语句显示有关表中列的信息。我们可以看到 Id 列定义了 PRIMARY KEY,BrandName 设置了 UNIQUE 约束。当处理特定表时,主键用于唯一标识表中的行。唯一键确保列中的所有数据不重复。
外键
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。它是两个表之间的引用约束。外键标识一个(引用)表中的一个或一组列,这些列引用另一个(被引用)表中的一个或一组列。
我们将在两个表上演示此约束:Authors 和 Books。
mysql> CREATE TABLE Authors(AuthorId INTEGER PRIMARY KEY, Name VARCHAR(70))
-> type=InnoDB;
在这里,我们创建了 Authors 表。在 MySQL 中,引用表和被引用表必须是 InnoDB 或 BDB 存储引擎。在 MyISAM 存储引擎中,外键被解析,但未被强制执行。
mysql> CREATE TABLE Books(BookId INTEGER PRIMARY KEY, Title VARCHAR(50),
-> AuthorId INTEGER, FOREIGN KEY(AuthorId) REFERENCES Authors(AuthorId))
-> type=InnoDB;
我们创建了 Books 表。在这里,我们有一个 AuthorId 列名,它充当外键。它引用了 Authors 表的主键。
外键强制执行在我们的示例中意味着什么?我们无法将行插入到 Books 表中,其中包含 AuthorId,该 ID 不存在于 Authors 表中。
ENUM 约束
ENUM 是一个字符串对象,其值从允许值的列表中选择。它们在表创建时在列规范中显式枚举。
mysql> CREATE TABLE Shops(Id INTEGER, Name VARCHAR(55),
-> Quality ENUM('High', 'Average', 'Low'));
我们有一个 Shops 表。该表定义了 Id、Name 和 Quality 列。Quality 列是一个 ENUM。它允许具有三个指定值中的一个:High、Average 或 Low。
mysql> INSERT INTO Shops VALUES(1, 'Boneys', 'High'); mysql> INSERT INTO Shops VALUES(2, 'AC River', 'Average'); mysql> INSERT INTO Shops VALUES(3, 'AT 34', '**'); mysql> SELECT * FROM Shops; +------+----------+---------+ | Id | Name | Quality | +------+----------+---------+ | 1 | Boneys | High | | 2 | AC River | Average | | 3 | AT 34 | | +------+----------+---------+
在前两个语句中,我们插入了两行。在第三种情况下,该值在 ENUM 中不可用。在这种情况下,插入一个空字符串。
SET 约束
一个 SET 可以有零个或多个值。每个值都必须从允许值的列表中选择。
mysql> CREATE TABLE Students(Id INTEGER, Name VARCHAR(55),
-> Certificates SET('A1', 'A2', 'B1', 'C1'));
我们有一个 Students 表。在此表中,我们有一个 Certificates 列。每个学生可以拥有 0 个、1 个或多个这些证书。这与 ENUM 约束不同,在 ENUM 约束中,您只能从允许值的列表中获取一个不同的值。
mysql> INSERT INTO Students VALUES(1, 'Paul', 'A1,B1'); mysql> INSERT INTO Students VALUES(2, 'Jane', 'A1,B1,A2'); mysql> INSERT INTO Students VALUES(3, 'Mark', 'A1,A2,D1,D2'); mysql> SELECT * FROM Students; +------+------+--------------+ | Id | Name | Certificates | +------+------+--------------+ | 1 | Paul | A1,B1 | | 2 | Jane | A1,A2,B1 | | 3 | Mark | A1,A2 | +------+------+--------------+
保罗有两个证书,简有三个证书,马克有四个证书,但只有两个被认可,因此只有前两个被写入表中。证书之间用逗号分隔。不允许有空格。
在本 MySQL 教程中,我们介绍了 MySQL 支持的约束。