MySQL − 约束
- MySQL 约束
- MySQL NOT NULL 约束
- MySQL UNIQUE 约束
- MySQL PRIMARY KEY 约束
- MySQL FOREIGN KEY 约束
- MySQL CHECK 约束
- MySQL DEFAULT 约束
- MySQL创建索引约束
- MySQL AUTO_INCREMENT 约束
MySQL 约束
MySQL 约束可用于为表中的列设置某些规则。这些约束可以限制在特定列中可插入或更新的数据类型。这有助于您维护表中数据的准确性和可靠性。
MySQL 约束有两种类型。
- 列级约束:这类约束仅适用于表中的某一列。
- 表级约束:这类约束将应用于整个表。
MySQL 中常用的约束包括 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT、CREATE INDEX、AUTO_INCREMENT 等。
语法
以下是在表中为列添加约束的基本语法 -
CREATE TABLE table_name ( Column_name1 datatype constraint, Column_name2 datatype constraint, Column_name3 datatype constraint, ......... );
MySQL NOT NULL 约束
默认情况下,MySQL 表中的列可以包含 NULL 值。在某些情况下,我们可能希望特定列不接受或包含 NULL 值。为此,我们可以使用 MySQL NOT NULL 约束。
此约束强制特定字段始终包含一个值,这意味着如果不向该字段添加值,我们就无法插入或更新记录。
示例
在下面的查询中,我们在 CUSTOMERS 表的 ID 和 NAME 列上添加 NOT NULL 约束。因此,在插入记录时,ID 和 NAME 列将不接受 NULL 值。
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int );
我们尝试向此表中插入记录。以下语句将向 CUSTOMERS 表中插入一条记录 -
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18);
但是,如果我们尝试插入 ID 为 NULL 的记录 -
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(Null, 'Varun', 26);
将生成一条错误,提示"列'ID'不能为空"。
ERROR 1048 (23000): Column 'ID' cannot be null
同样,如果我们尝试将 NULL 作为值传递给 NAME 列,也会产生类似的错误。
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(3, Null, 19);
这将产生以下错误 -
ERROR 1048 (23000): Column 'NAME' cannot be null
如上查询所示,第一条记录已成功插入,因为它在 ID 和 Name 列中没有空值。然而,第二条和第三条记录未插入,因为我们试图在不该为 NULL 的列中插入 NULL 值。
MySQL UNIQUE 约束
MySQL 中的 UNIQUE 约束确保列中的每个值都必须不同。这意味着具有 UNIQUE 约束的列不能重复相同的值;每个值都必须唯一。
注意:我们可以在单个表上设置一个或多个 UNIQUE 约束。
示例
以下查询在 CUSTOMERS 表的 ID 列上创建 UNIQUE 约束 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, UNIQUE (ID) );
现在,我们将以下记录插入到上面创建的表中 -
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18); INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Varun', 26);
在上面的代码块中,第二个插入语句返回错误"Duplicate entry '1' for key 'customers.ID",因为我们插入的 ID 值已存在于表中。因此,它是重复的,查询会生成以下错误 -
ERROR 1062 (23000): Duplicate entry '1' for key 'customers.ID'
MySQL 主键约束
MySQL 中的主键约束用于唯一标识表中的每条记录。这意味着,如果我们在表中的某个列上定义主键,则该列必须包含唯一值,并且不能包含空值。
注意:一个表只能有一个主键。
示例
以下查询在 CUSTOMERS 表的 ID 列上创建主键 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, PRIMARY KEY (ID) );
创建表后,将以下记录插入到上面创建的表中 -
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (1, 'Nikhil', 18); Query OK, 1 row affected (0.01 sec)
由于我们在 ID 列上添加了 PRIMARY KEY 约束,如果您尝试插入具有重复 ID 值或 NULL 值的记录,则会产生错误。
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (1, 'Varun', 26); ERROR 1062 (23000): Duplicate entry '1' for key 'customers.PRIMARY' INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES (NULL, 'Datta', 19); ERROR 1048 (23000): Column 'ID' cannot be null
如上查询所示,第一个插入语句已成功插入表中。而第二个和第三个语句返回错误,因为它们在主键列(即 ID)中包含重复值和 NULL 值。
MySQL 外键约束
MySQL 中的外键约束用于将一个表中的字段或字段集合链接到另一个表的主键。
具有外键的表称为子表,具有主键的表称为父表或引用表。
示例
以下查询在创建 ORDERS 表时在 CUST_ID 列上创建外键 -
表:客户
CREATE TABLE CUSTOMERS ( CUST_ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, PRIMARY KEY (CUST_ID) );
表: Orders
CREATE TABLE ORDERS ( ORDER_ID int NOT NULL, ORDER_NUMBER int NOT NULL, CUST_ID int, FOREIGN KEY (CUST_ID) REFERENCES CUSTOMERS (CUST_ID) );
MySQL CHECK 约束
MySQL 中的 CHECK 约束限制了可插入列的值的范围。此约束确保插入列的值必须满足指定的条件。
示例
以下查询在 CUSTOMERS 表的 AGE 列上创建 CHECK 约束,以确保学生的年龄必须为 18 岁或以上 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, CHECK (AGE >= 18) );
创建表后,我们可以将记录插入到上面创建的表中,如下所示 -
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18); INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(3, 'Datta', 19);
由于我们在 AGE 列上添加了 CHECK 约束,因此学生的年龄必须大于或等于 18 岁。如果您尝试插入年龄小于 18 岁的记录,则会生成错误。
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(2, 'Varun', 16); ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated. INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(4, 'Karthik', 15); ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.
示例
以下查询在多个列(AGE 和 ADDRESS)上创建了 CHECK 约束 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, ADDRESS varchar(40), CONSTRAINT CHECK_AGE CHECK (AGE >= 18 AND ADDRESS = "Mumbai") );
现在,让我们将以下记录插入到上面创建的表中 -
INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(1, 'Nikhil', 18, 'Mumbai'); Query OK, 1 row affected (0.01 sec) INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(3, 'Datta', 19, 'Delhi'); ERROR 3819 (HY000): Check constraint 'CHECK_AGE_AND_ADDRESS' is violated.
第二条插入语句返回错误,因为它违反了检查约束的条件,即 (AGE >= 18 AND ADDRESS = "Mumbai")。
MySQL DEFAULT 约束
MySQL 中的 DEFAULT 约束用于为表中的特定列分配默认值。当插入过程中未提供其他值时,此默认值将应用于 DEFAULT 指定列中的任何新记录。
示例
在下面的查询中,我们在 CUSTOMERS 表的 ADDRESS 列上定义 DEFAULT 约束。当未插入任何值时,我们将"Mumbai"指定为默认值。-
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, ADDRESS varchar(40) DEFAULT "Mumbai" );
这里,我们插入前两条记录,ADDRESS 列中没有任何值。在第三条记录中,我们将 ADDRESS 值插入为"Delhi"。
INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(1, 'Nikhil', 18); INSERT INTO CUSTOMERS(ID, NAME, AGE) VALUES(2, 'Varun', 16); INSERT INTO CUSTOMERS(ID, NAME, AGE, ADDRESS) VALUES(3, 'Datta', 19, 'Delhi');
执行以下查询以显示插入上述表中的记录 -
Select * from CUSTOMERS;
在下面的输出中,我们可以看到前两行的 ADDRESS 列中的值默认为"Mumbai"。
ID | NAME | AGE | ADDRESS |
---|---|---|---|
1 | Nikhil | 18 | Mumbai |
2 | Varun | 16 | Mumbai |
3 | Datta | 19 | Delhi |
MySQL CREATE INDEX 约束
MySQL 中的 CREATE INDEX 约束用于为表中的一列创建索引。
索引用于更快地从数据库获取数据。但是,用户无法看到索引的实际作用,它们只是用来加快搜索和查询的速度。
示例
在这里,我们使用以下查询创建一个名为 CUSTOMERS 的表 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL, NAME varchar(20) NOT NULL, AGE int, ADDRESS varchar(40), PRIMARY KEY (ID) );
以下查询在 CUSTOMERS 表的 ADDRESS 列上创建一个名为"index_address"的索引 -
CREATE INDEX index_address ON CUSTOMERS (ADDRESS);
MySQL AUTO_INCREMENT 约束
当在表的特定列上定义 AUTO_INCREMENT 约束时,当新记录插入该列时,它将自动生成一个唯一的编号。
默认情况下,起始值为 1,并且每插入一条新记录,它都会自动将其值加 1。
示例
以下查询在 CUSTOMERS 表的 ID 列上添加 AUTO_INCREMENT 约束 -
CREATE TABLE CUSTOMERS ( ID int NOT NULL AUTO_INCREMENT, NAME varchar(20) NOT NULL, AGE int, PRIMARY KEY (ID) );
在下面的插入语句中,我们不会插入 ID 值。
INSERT INTO STUDENTS(NAME, AGE) VALUES('Nikhil', 18); INSERT INTO STUDENTS(NAME, AGE) VALUES('Varun', 16); INSERT INTO STUDENTS(NAME, AGE) VALUES('Datta', 19);
现在,执行以下查询以显示上述创建的表的记录 -
Select * from CUSTOMERS;
正如我们在下面的 STUDENTS 表中看到的,由于 ID 列上的 AUTO_INCREMENT 约束,ID 列中的值会自动递增。
ID | NAME | AGE |
---|---|---|
1 | Nikhil | 18 |
2 | Varun | 16 |
3 | Datta | 19 |