
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者賬戶
- MySQL - 解鎖使用者賬戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - 插入查詢
- MySQL - 選擇查詢
- MySQL - 更新查詢
- MySQL - 刪除查詢
- MySQL - 替換查詢
- MySQL - 插入忽略
- MySQL - 插入重複鍵更新
- MySQL - 插入到選擇
- MySQL 運算子和子句
- MySQL - Where 子句
- MySQL - Limit 子句
- MySQL - Distinct 子句
- MySQL - Order By 子句
- MySQL - Group By 子句
- MySQL - Having 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - Like 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - Between 運算子
- MySQL - UNION 運算子
- MySQL - UNION 與 UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - 內連線
- MySQL - 左連線
- MySQL - 右連線
- MySQL - 交叉連線
- MySQL - 全連線
- MySQL - 自連線
- MySQL - 刪除連線
- MySQL - 更新連線
- MySQL - Union 與 Join
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - 插入前觸發器
- MySQL - 插入後觸發器
- MySQL - 更新前觸發器
- MySQL - 更新後觸發器
- MySQL - 刪除前觸發器
- MySQL - 刪除後觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - 訊號
- MySQL - 重新發送訊號
- MySQL - 字元集
- MySQL - 校對
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 當天日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - Explain
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - 顯示 Processlist
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
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表的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);
將生成錯誤“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 |