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