MySQL數(shù)據(jù)表的常見(jiàn)約束小結(jié)
在數(shù)據(jù)庫(kù)設(shè)計(jì)中,約束(Constraints)是用于確保數(shù)據(jù)的完整性、準(zhǔn)確性和一致性的規(guī)則。MySQL 提供了多種約束類型,幫助我們規(guī)范數(shù)據(jù)存儲(chǔ),并確保其符合預(yù)期的規(guī)則。常見(jiàn)的約束包括 主鍵(Primary Key)、外鍵(Foreign Key)、唯一約束(Unique)、非空約束(Not Null)、默認(rèn)值(Default) 和 檢查約束(Check)。
1. 主鍵約束(Primary Key)
作用:主鍵是用于唯一標(biāo)識(shí)表中每一行數(shù)據(jù)的列。它不僅要求該列的值是唯一的,而且不能為空(即不允許 NULL)。每個(gè)表只能有一個(gè)主鍵。
特點(diǎn):
- 唯一性:主鍵列中的每個(gè)值必須是唯一的。
- 不允許空值:主鍵列不能包含 NULL 值。
- 自動(dòng)索引:MySQL 會(huì)自動(dòng)為主鍵列創(chuàng)建索引,優(yōu)化查詢性能。
示例:
CREATE TABLE employees ( employee_id INT NOT NULL, first_name VARCHAR(50), last_name VARCHAR(50), PRIMARY KEY (employee_id) );
在上述示例中,employee_id 是主鍵,它唯一標(biāo)識(shí)每個(gè)員工記錄,并且不能為 NULL。
2. 外鍵約束(Foreign Key)
作用:外鍵約束用于在兩張表之間建立連接關(guān)系,確保一個(gè)表中的某列數(shù)據(jù)必須與另一表中的主鍵或唯一鍵數(shù)據(jù)相匹配。外鍵用于維護(hù)數(shù)據(jù)的參照完整性。
特點(diǎn):
- 外鍵列的值必須與參照表中的主鍵或唯一列值一致。
- 外鍵約束可以定義更新或刪除時(shí)的級(jí)聯(lián)操作,例如:ON DELETE CASCADE 或 ON UPDATE CASCADE。
示例:
CREATE TABLE departments ( department_id INT NOT NULL, department_name VARCHAR(50), PRIMARY KEY (department_id) ); CREATE TABLE employees ( employee_id INT NOT NULL, first_name VARCHAR(50), last_name VARCHAR(50), department_id INT, PRIMARY KEY (employee_id), FOREIGN KEY (department_id) REFERENCES departments(department_id) );
在這個(gè)例子中,employees 表中的 department_id 列是外鍵,指向 departments 表中的 department_id 列。這確保了每個(gè)員工必須隸屬于某個(gè)部門。
3. 唯一約束(Unique)
作用:唯一約束確保某一列中的所有值都是唯一的,不允許重復(fù)。與主鍵不同的是,唯一約束允許列中存在 NULL 值,但多個(gè) NULL 值可以存在。
特點(diǎn):
- 保證列中所有非 NULL 的值是唯一的。
- 允許多個(gè) NULL 值(在不同數(shù)據(jù)庫(kù)系統(tǒng)中可能有所不同)。
示例:
CREATE TABLE users ( user_id INT NOT NULL, username VARCHAR(50) UNIQUE, email VARCHAR(100) UNIQUE, PRIMARY KEY (user_id) );
在上面的表中,username 和 email 列具有唯一約束,確保沒(méi)有兩個(gè)用戶使用相同的用戶名或郵箱。
4. 非空約束(Not Null)
作用:非空約束確保列中的數(shù)據(jù)不能為 NULL。當(dāng)定義了 NOT NULL 約束時(shí),插入數(shù)據(jù)時(shí)必須為該列提供一個(gè)有效的值。
特點(diǎn):
- 強(qiáng)制要求列必須有值。
- 常用于對(duì)業(yè)務(wù)邏輯有特殊要求的字段。
示例:
CREATE TABLE products ( product_id INT NOT NULL, product_name VARCHAR(100) NOT NULL, price DECIMAL(10, 2), PRIMARY KEY (product_id) );
在該示例中,product_name 列不能為 NULL,每個(gè)產(chǎn)品必須有名稱。
5. 默認(rèn)值約束(Default)
作用:默認(rèn)值約束用于在插入數(shù)據(jù)時(shí)為列指定一個(gè)默認(rèn)值。當(dāng)插入數(shù)據(jù)時(shí)沒(méi)有提供該列的值時(shí),MySQL 會(huì)使用默認(rèn)值。
特點(diǎn):
- 提供一個(gè)列的默認(rèn)值。
- 如果未指定列的值,數(shù)據(jù)庫(kù)將使用默認(rèn)值。
示例:
CREATE TABLE orders ( order_id INT NOT NULL, order_date DATE DEFAULT CURRENT_DATE, status VARCHAR(20) DEFAULT 'Pending', PRIMARY KEY (order_id) );
在這個(gè)例子中,order_date 列的默認(rèn)值是當(dāng)前日期,而 status 列的默認(rèn)值是 ‘Pending’。
6. 檢查約束(Check)
作用:檢查約束用于限制列中的數(shù)據(jù)必須滿足某個(gè)條件。它可以確保插入的數(shù)據(jù)符合特定規(guī)則。此約束在 MySQL 8.0.16 及之后版本中得到了支持。
特點(diǎn):
- 強(qiáng)制列中的數(shù)據(jù)符合指定的條件。
- 可以使用邏輯表達(dá)式定義復(fù)雜的條件。
示例:
CREATE TABLE employees ( employee_id INT NOT NULL, first_name VARCHAR(50), last_name VARCHAR(50), age INT, salary DECIMAL(10, 2), PRIMARY KEY (employee_id), CHECK (age >= 18), CHECK (salary >= 0) );
在該表中,age 列的值必須大于等于 18,salary 列的值必須大于等于 0。
7. 邏輯與物理連接性
在數(shù)據(jù)庫(kù)中,邏輯連接性和物理連接性是數(shù)據(jù)庫(kù)設(shè)計(jì)中重要的概念:
邏輯連接性 指的是通過(guò)外鍵約束在表之間建立的關(guān)聯(lián)關(guān)系。這些關(guān)聯(lián)定義了數(shù)據(jù)如何在邏輯上被組織和約束。
物理連接性 側(cè)重于數(shù)據(jù)庫(kù)表在物理存儲(chǔ)上的關(guān)聯(lián)。例如,數(shù)據(jù)庫(kù)可以使用索引來(lái)提高查詢效率,尤其是在主鍵和唯一約束下,MySQL 會(huì)為這些列自動(dòng)創(chuàng)建索引。
示例:
CREATE TABLE products ( product_id INT NOT NULL, product_name VARCHAR(100), PRIMARY KEY (product_id) ); CREATE TABLE order_items ( order_item_id INT NOT NULL, product_id INT NOT NULL, quantity INT, PRIMARY KEY (order_item_id), FOREIGN KEY (product_id) REFERENCES products(product_id) );
在上述示例中,order_items 表通過(guò) product_id 外鍵與 products 表建立了邏輯上的連接。物理上,MySQL 可能會(huì)為 product_id 列創(chuàng)建索引,以加速查詢。
8. 修改約束(ALTER TABLE)
如果在創(chuàng)建表后,需要修改表的約束,可以使用 ALTER TABLE 語(yǔ)句來(lái)添加、刪除或修改約束。
示例:添加約束
ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65);
示例:刪除約束
ALTER TABLE employees DROP CONSTRAINT chk_age;
9. 綜合示例:創(chuàng)建完整的訂單系統(tǒng)
結(jié)合前面的約束,以下是一個(gè)簡(jiǎn)單的訂單系統(tǒng)設(shè)計(jì)示例,其中包含主鍵、外鍵、唯一約束、非空約束、默認(rèn)值和檢查約束:
CREATE TABLE customers ( customer_id INT NOT NULL, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE, phone VARCHAR(15), PRIMARY KEY (customer_id) ); CREATE TABLE products ( product_id INT NOT NULL, product_name VARCHAR(100) NOT NULL, price DECIMAL(10, 2) NOT NULL, PRIMARY KEY (product_id) ); CREATE TABLE orders ( order_id INT NOT NULL, customer_id INT NOT NULL, order_date DATE DEFAULT CURRENT_DATE, status VARCHAR(20) DEFAULT 'Pending', PRIMARY KEY (order_id), FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); CREATE TABLE order_items ( order_item_id INT NOT NULL, order_id INT NOT NULL, product_id INT NOT NULL, quantity INT CHECK (quantity > 0), PRIMARY KEY (order_item_id), FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (product_id) REFERENCES products(product_id) );
在這個(gè)系統(tǒng)中:
- customers 表存儲(chǔ)客戶信息,email 列具有唯一約束,確保每個(gè)客戶的郵箱地址唯一。
- products 表存儲(chǔ)商品信息,每個(gè)商品有唯一的 product_id。
- orders 表記錄客戶訂單,customer_id 是外鍵,指向 customers 表。
- order_items 表記錄每個(gè)訂單的商品,包含外鍵 order_id 和 product_id,并對(duì) quantity 列設(shè)置了檢查約束,確保每個(gè)訂單項(xiàng)的商品數(shù)量大于 0。
結(jié)語(yǔ)
通過(guò)合理使用 MySQL 中的約束,可以確保數(shù)據(jù)的完整性、正確性和一致性。在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),約束不僅能防止錯(cuò)誤數(shù)據(jù)的插入,還能提高數(shù)據(jù)查詢和操作的效率。掌握這些約束的使用,將幫助我們?cè)趯?shí)際項(xiàng)目中構(gòu)建更高質(zhì)量的數(shù)據(jù)庫(kù)系統(tǒng)。
以上就是MySQL數(shù)據(jù)表的常見(jiàn)約束小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)表約束的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL升級(jí)PostgreSQL遇到的一些常見(jiàn)問(wèn)題及解決方案
MySQL是一款性能優(yōu)越、數(shù)據(jù)可靠性高的數(shù)據(jù)庫(kù)軟件,然而為了保證其長(zhǎng)期有效運(yùn)行,數(shù)據(jù)庫(kù)升級(jí)是非常重要的,下面這篇文章主要給大家介紹了關(guān)于MySQL升級(jí)PostgreSQL遇到的一些常見(jiàn)問(wèn)題及解決方案的相關(guān)資料,需要的朋友可以參考下2024-05-05mysql修改數(shù)據(jù)庫(kù)默認(rèn)路徑無(wú)法啟動(dòng)問(wèn)題的解決
這篇文章主要給大家介紹了關(guān)于mysql修改數(shù)據(jù)庫(kù)默認(rèn)路徑無(wú)法啟動(dòng)問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11MySQL主從復(fù)制斷開(kāi)的常用修復(fù)方法
這篇文章主要介紹了MySQL主從復(fù)制斷開(kāi)的常用修復(fù)方法,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-04-04Mysql實(shí)現(xiàn)定時(shí)清空一張表的舊數(shù)據(jù)并保留幾條數(shù)據(jù)(推薦)
這篇文章主要介紹了Mysql實(shí)現(xiàn)定時(shí)清空一張表的舊數(shù)據(jù)并保留幾條數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12SQL?SERVER數(shù)據(jù)庫(kù)服務(wù)器CPU不能全部利用原因解析
這篇文章主要介紹了SQL?SERVER數(shù)據(jù)庫(kù)服務(wù)器CPU不能全部利用原因解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09MySQL?InnoDB?存儲(chǔ)引擎的底層邏輯架構(gòu)
這篇文章主要為大家介紹了MySQL?InnoDB?存儲(chǔ)引擎的底層邏輯架構(gòu)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09