MySQL − 约束



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表的IDNAME列添加 NOT NULL 约束。因此,在记录插入时,IDNAME列将不接受 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);

将生成错误“Column 'ID' cannot be null”。

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 的列中插入 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 PRIMARY KEY 约束

MySQL 中的 PRIMARY KEY 约束用于唯一标识表中的每条记录。这意味着,如果我们在表中的特定列上定义主键,则它必须包含唯一值,并且不能包含 NULL 值。

注意:一个表只能有一个主键。

示例

以下查询在 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 FOREIGN KEY 约束

MySQL 中的 FOREIGN KEY 约束用于将一个表中的一列或多列链接到另一个表的主键。

具有外键的表称为子表,具有主键的表称为父表或被引用表。

示例

以下查询在创建 ORDERS 表时在 CUST_ID 列上创建外键:

表:Customers

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
广告