MySQL - 约束条件

MySQL - 约束条件 首页 / MySQL入门教程 / MySQL - 约束条件

MySQL中的约束用于指定允许或限制将在表中存储哪些值/数据的规则。它们提供了一种合适的方法来确保表中数据的准确性和完整性。它还有助于限制将在表内插入的数据的类型。如果约束和数据操作之间发生任何中断,则该操作将失败。

约束类型

MySQL中的约束分为两种类型:

  1. 列级约束:这些约束仅适用于限制特定列数据类型的单个列。
  2. 表级约束:这些约束适用于整个表,从而限制了整个表的数据类型。

创建约束

无涯教程可以在使用CREATE TABLE语句创建的表中定义约束。对于现有的表模式,MySQL还使用ALTER TABLE语句指定约束。

以下是在表中创建约束的语法:

CREATE TABLE new_table_name (
    col_name1 datatype constraint,
    col_name2 datatype constraint,
    col_name3 datatype constraint,
    .........
);

使用约束

以下是MySQL中最常用的约束:

  • 非空(NOT NULL)
  • 检查(CHECK)
  • 默认(DEFAULT)
  • 主键(PRIMARY KEY)
  • AUTO_INCREMENT
  • 唯一(UNIQUE)
  • 索引(INDEX)
  • 枚举(ENUM)
  • 外键(FOREIGN KEY)

让无涯教程详细讨论这些约束中的每一个。

NOT NULL约束

此约束指定该列不能具有NULL或空值。下面的语句创建一个具有NOT NULL约束的表。

mysql> CREATE TABLE Student(Id INTEGER, LastName TEXT NOT NULL, FirstName TEXT NOT NULL, City VARCHAR(35));

执行下面列出的查询以了解其工作方式:

mysql> INSERT INTO Student VALUES(1, 'Hanks', 'Peter', 'New York');

mysql> INSERT INTO Student VALUES(2, NULL, 'Amanda', 'Florida'); 

输出

MySQL Constraints

在上图中,无涯教程可以看到第一个INSERT查询正确执行,但是第二个语句失败并给出错误,指出LastName列不能为null。

唯一(UNIQUE)约束

此约束确保插入到列中的所有值都是唯一的。这意味着列不能存储重复值。 MySQL允许在一个表中使用多个具有UNIQUE约束的列。下面的语句创建一个具有UNIQUE约束的表:

mysql> CREATE TABLE ShirtBrands(Id INTEGER, BrandName VARCHAR(40) UNIQUE, Size VARCHAR(30));

执行下面列出的查询以了解其工作方式:

mysql> INSERT INTO ShirtBrands(Id, BrandName, Size) VALUES(1, 'Pantaloons', 38), (2, 'Cantabil', 40);

mysql> INSERT INTO ShirtBrands(Id, BrandName, Size) VALUES(1, 'Raymond', 38), (2, 'Cantabil', 40); 

在下面的输出中,可以看到第一个INSERT查询正确执行,但是第二个语句失败并给出错误消息:键BrandName的条目" Cantabil"重复。

MySQL Constraints

检查(CHECK)约束

它控制特定列中的值。它确保必须满足给定条件的列中的插入值。换句话说,它在给定条件下确定与列关联的值是否有效。

在版本8.0.16之前,MySQL使用此约束语法的受限版本,如下所示:

CHECK (expr)

在8.0.16版本之后,MySQL对所有存储引擎使用CHECK约束,即表约束和列约束,如下所示:

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

让无涯教程了解CHECK约束在MySQL中是如何工作的。例如,以下语句创建一个表" Persons",该表在" Age"列上包含CHECK约束。 CHECK约束确保给定条件满足列中的插入值,这意味着一个人的年龄应大于或等于18:

mysql> CREATE TABLE Persons (
    ID int NOT NULL,
    Name varchar(45) NOT NULL,
    Age int CHECK (Age>=18)
);

执行列出的查询以将值插入表中:

mysql> INSERT INTO Persons(Id, Name, Age) 
VALUES (1,'Robert', 28), (2, 'Joseph', 35), (3, 'Peter', 40);

mysql> INSERT INTO Persons(Id, Name, Age) VALUES (1,'Robert', 15);

在下面的输出中,可以看到第一个INSERT查询成功执行,但是第二条语句失败并给出错误消息:键Age违反了CHECK约束。

MySQL Constraints

默认(DEFAULT)约束

此约束用于为未指定任何值的特定列设置默认值。这意味着该列必须包含一个值,包括NULL。

例如,以下语句创建一个表" Persons",该表在"城市"列上包含DEFAULT约束。如果无涯教程尚未在"城市"列中指定任何值,则会插入默认值:

mysql> CREATE TABLE Persons (
    ID int NOT NULL,
    Name varchar(45) NOT NULL,
    Age int,
    City varchar(25) DEFAULT 'New York'
);

执行列出的查询以将值插入表中:

mysql> INSERT INTO Persons(Id, Name, Age, City) 
VALUES (1,'Robert', 15, 'Florida'), 
(2, 'Joseph', 35, 'California'), 
(3, 'Peter', 40, 'Alaska');

mysql> INSERT INTO Persons(Id, Name, Age) VALUES (1,'Brayan', 15);

在下面的输出中,可以看到第一个包含所有字段的插入查询成功执行,而第二个插入语句不包含" City"列,但也成功执行了。这是因为它具有默认值。

MySQL Constraints

现在,执行以下语句来验证第四列的默认值:

mysql> SELECT * FROM Persons;

可以看到它运行完美。这意味着默认值"纽约"将自动存储在"城市"列中。

MySQL Constraints

主键(PRIMARY KEY)约束

此约束用于唯一标识表中的每个记录。如果该列包含主键约束,则它不能为null或为空。一个表可能具有重复的列,但是它只能包含一个主键。它始终将唯一值包含到列中。

以下语句创建一个表" Person",并更清楚地说明此主键的用法:

CREATE TABLE Persons (
	ID int NOT NULL PRIMARY KEY, 
	Name varchar(45) NOT NULL, 
	Age int, 
	City varchar(25));

接下来,使用插入查询将数据存储到表中:

INSERT INTO Persons(Id, Name, Age, City) 
VALUES (1,'Robert', 15, 'Florida') , 
(2, 'Joseph', 35, 'California'), 
(3, 'Peter', 40, 'Alaska');

INSERT INTO Persons(Id, Name, Age, City) 
VALUES (1,'Stephen', 15, 'Florida');

在下面的输出中,无涯教程可以看到第一个插入查询成功执行。当第二个insert语句失败并给出错误消息时:主键列的条目重复。

MySQL Constraints

AUTO_INCREMENT约束

每当在表中插入新记录时,此约束都会自动生成一个唯一编号。通常,将此约束用于表中的主键字段。

可以通过以下示例来理解它,其中id列将在Animal表中自动增加:

mysql> CREATE TABLE Animals(
id int NOT NULL AUTO_INCREMENT, 
name CHAR(30) NOT NULL, 
PRIMARY KEY (id));

接下来,需要将值插入"Animals"表中:

mysql> INSERT INTO Animals (name) VALUES 
('Tiger'),('Dog'),('Penguin'), 
('Camel'),('Cat'),('Ostrich');

现在,执行以下语句以获取表数据:

mysql> SELECT * FROM Animals;

在输出中,无涯教程可以看到没有为auto-increment列指定任何值,因此MySQL会自动按此字段的顺序生成一个唯一的数字。

MySQL Constraints

枚举(ENUM)约束

MySQL中的ENUM数据类型是一个字符串对象。它允许在创建表时限制从列规范中的允许值列表中选择的值。它是枚举的缩写,这意味着每一列都可以具有指定的可能值之一。它使用数字索引(1、2、3…)表示字符串值。

无涯教程网

下图创建了一个名为" shirts"的表,该表包含三列:id,name和size。列名称" size"使用包含小,中,大和x大尺寸的ENUM数据类型。

mysql> CREATE TABLE Shirts (  
    id INT PRIMARY KEY AUTO_INCREMENT,   
    name VARCHAR(35),   
    size ENUM('small', 'medium', 'large', 'x-large')  
);

接下来,需要使用以下语句将值插入"衬衫"表中:

mysql> INSERT INTO Shirts(id, name, size)   
VALUES (1,'t-shirt', 'medium'),   
(2, 'casual-shirt', 'small'),   
(3, 'formal-shirt', 'large');

现在,执行SELECT语句以查看表中插入的值:

链接:https://www.learnfk.comhttps://www.learnfk.com/mysql/mysql-constraints.html

来源:LearnFk无涯教程网

mysql> SELECT * FROM Shirts;

无涯教程将得到以下输出:

MySQL Constraints

索引(INDEX)约束

这个约束使可以非常快速,轻松地从表中创建和检索值。可以使用一个或多个列来创建索引。它以将行插入表的方式为每行分配一个ROWID。

下图创建了一个名为" shirts"的表,该表包含三列:id,name和size。

mysql> CREATE TABLE Shirts (  
    id INT PRIMARY KEY AUTO_INCREMENT,   
    name VARCHAR(35),   
    size ENUM('small', 'medium', 'large', 'x-large')  
);

接下来,需要使用以下语句将值插入"Shirts"表中:

mysql> INSERT INTO Shirts(id, name, size)   
VALUES (1,'t-shirt', 'medium'),   
(2, 'casual-shirt', 'small'),   
(3, 'formal-shirt', 'large');

现在,执行以下语句来创建索引:

mysql> CREATE INDEX idx_name ON Shirts(name);

无涯教程可以使用下面的查询通过索引列检索数据:

mysql> SELECT * FROM Shirts USE INDEX(idx_name);

出现以下输出:

MySQL Constraints

外键(FOREIGN KEY)约束

此约束用于将两个表链接在一起。也称为引用键。外键列与另一个表的主键字段匹配。这意味着一个表中的外键字段是指另一表的主键字段。

考虑一下这些表的结构:Persons和Orders。

表名:Persons

CREATE TABLE Persons (
	Person_ID int NOT NULL PRIMARY KEY, 
	Name varchar(45) NOT NULL, 
	Age int, 
	City varchar(25)
);

表名:Orders

CREATE TABLE Orders (
    Order_ID int NOT NULL PRIMARY KEY,
    Order_Num int NOT NULL,
    Person_ID int,
    FOREIGN KEY (Person_ID) REFERENCES Persons(Person_ID)
);

在上面的表结构中,可以看到"Orders"表中的" Person_ID"字段指向"Persons"表中的" Person_ID"字段。 " Person_ID"是" Persons"表中的主键,而" Orders"表的" Person_ID"列则是FOREIGN KEY。

无涯教程的表包含以下数据:

MySQL Constraints

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

快速上手Kotlin开发 -〔张涛〕

OpenResty从入门到实战 -〔温铭〕

消息队列高手课 -〔李玥〕

MongoDB高手课 -〔唐建法(TJ)〕

编译原理实战课 -〔宫文学〕

物联网开发实战 -〔郭朝斌〕

流程型组织15讲 -〔蒋伟良〕

说透数字化转型 -〔付晓岩〕

玩转Vue 3全家桶 -〔大圣〕

好记忆不如烂笔头。留下您的足迹吧 :)