保證良好數據庫結構的 5 個 SQL 約束
要點
使用 SQL 約束對於保持數據庫的完整性至關重要,同時還能確保其內容的一致性。此類約束之一是 NOT NULL 約束,它要求列不能接受空值,從而強調在這些字段中提供有效信息的重要性。
為了保持關係數據庫中數據的完整性和準確性,對特定列或列集實施主鍵約束非常重要。這些唯一的標識符可以防止記錄重複並促進信息的有效組織和檢索。
外鍵約束通過強制引用完整性來維護關係數據庫的完整性,確保子表中的每條記錄對應於父表中的現有記錄。這些約束對於保持多個表之間數據的互連性以及防止未經授權的修改或刪除至關重要,這些修改或刪除可能會損害整個數據庫的準確性和一致性。
組織良好的數據庫對於眾多功能至關重要,但如果沒有建立數據存儲和操作協議,混亂可能會隨之而來。
SQL 約束用於為特定表內的數據存儲建立指導方針。這些約束使系統在嘗試插入或更新與已建立的參數相矛盾的信息時生成錯誤消息。通過執行此類規則,數據庫可以保持數據一致性並強制所有表遵守標準。
存在多種 SQL 約束,它們對於確保數據庫內的數據完整性和安全性非常有益。
NOT NULL 約束
默認情況下,數據庫列允許存儲空值。 Null 表示不存在任何值。相反,非空約束要求特定列必須排除空值,而需要實際值。
聲明性語句用於強制要求表中的每一行必須在其各自的不可為空列中具有相應的條目,這些列由“NOT NULL”約束指定。換句話說,除非所有必填字段都填充了數據,否則不允許向數據庫中插入或以其他方式引入新記錄,否則將導致生成錯誤。
考慮一個例子,其中客戶的表格表示對於組織目的來說是必要的。在這種情況下,謹慎的做法可能是在所述數據庫中包含與每個顧客相關的某些不可或缺的細節,其中一個基本細節就是顧客的命名法。為了保證符合數據輸入要求,可以對這些強制包含的屬性實施稱為“NOT NULL”的約束,從而確保在不提供此關鍵識別信息的情況下不會存在任何客戶帳戶。
CREATE TABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Mobile_No int NOT NULL,
Age int
);
如果嘗試插入沒有年齡字段的客戶記錄,數據庫應確認這種嘗試,而不會生成任何錯誤消息:
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 0723000000);
儘管可以嘗試插入不包含“FirstName”字段的記錄,但數據庫系統將生成一條錯誤消息作為響應:
ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null).
主鍵約束
主鍵是任何關係數據庫管理系統中的基本元素,充當特定表中每個條目的獨特標識符。該名稱保證了所述列中包含的數據的單一性和個體性,防止重複,同時保持所有存儲信息的組織性和完整性。
在每個關係數據庫中,主鍵是一個重要組成部分,它由獨特的值組成,並且不能容納空值。構造表的一項基本原則是,每個表應該只擁有一個主鍵。該主鍵可以由一列或幾列組成,統稱為複合主鍵。
在構建客戶信息數據庫時,必須為每個顧客建立唯一的識別碼。為了實現這一目標,可以實現主鍵約束的概念,這確保沒有兩個客戶端擁有相同的標識符號。
為了在MySQL數據庫中實現主鍵約束,可以參考以下示例代碼:
CREATE TABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);
數據庫將拒絕用戶提交包含重複標識符的數據的任何嘗試。如果發生這種情況,將引發異常,表明存在重複信息。在所提供的場景中,個人嘗試添加兩個具有相同標識號的條目:
INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );
INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 );
數據庫將顯示一條錯誤消息:
Duplicate entry '1' for key 'PRIMARY'
主鍵的實現用於防止給定數據集中出現重複的標識符值,這一點可以從以下事實證明:更改分配給特定記錄的唯一標識符將導致數據庫拒絕嘗試插入或更新操作系統。此功能對於在處理大量信息(例如客戶記錄中的信息)時維護數據完整性和避免不一致尤其重要。
外鍵約束
外鍵是通過引用輔助表或相關表中一個表的主鍵來在兩個表之間創建關聯的一種方法。這允許這些單獨實體中包含的數據之間存在連接和相互依賴,從而促進通過共享共性建立鏈接和連接。
關係數據庫中兩個表之間的關係可以通過使用主鍵和外鍵來建立。在這種情況下,作為主要數據源並擁有每個記錄的唯一標識符的表稱為“父”表,而依賴另一個表的信息來建立自己的記錄的表稱為“父”表。 “子”表。由此可見,子表中記錄的任何條目必須與父表中的現有記錄相對應,作為關聯和驗證的手段。
外鍵約束的實現通過禁止任何可能損害這些連接的操作來確保互連數據庫表之間關係的保存。具體來說,刪除或移除用作另一個表的外鍵的表是受到限制的,因此需要同時終止兩個相關表以避免破壞它們的關聯。
與表中唯一的主鍵不同,外鍵可以存在於單個表中的多個實例中,並且可以包含空值。例如,在所提供的示例中,創建訂單需要利用 customer\_id 外鍵的值。
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
INSERT INTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');
INSERT INTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07');
當嘗試在沒有客戶預先存在的標識符的情況下生成交易時,系統將顯示錯誤通知。
Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`))
唯一約束
唯一約束是關係數據庫中的一種機制,可保證表中所有行中特定列的值的唯一性。與主鍵類似,此約束通過防止信息重複來維護數據一致性。未能實現此類約束可能會導致數據庫無組織,需要手動干預來識別和刪除冗餘記錄。
與單個主鍵相比,我們可以在單個表中使用多個唯一約束,如創建具有獨特標識符和電話號碼的“客戶”表所示。這種限制的實現是通過在 MySQL 數據庫管理系統中使用以下語法來執行的:
CREATE TABLE Customers (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
在使用相同電話號碼在數據庫中進行多個條目的情況下,將生成錯誤通知以指示這種重複。
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 );
為響應不成功的登錄嘗試而生成的通知或警報,其中包括有關用戶帳戶和任何相關權限的信息,通常遵循標準化格式,其中包含特定詳細信息,例如失敗的身份驗證嘗試的日期和時間、用戶名或與嘗試相關的帳戶名、失敗性質的簡要描述(例如,提供的密碼不正確)以及解決問題的相關說明
Duplicate entry '254000000' for key 'Mobile_No'
UNIQUE 約束是一種特定類型的數據庫約束,可保證數據庫中沒有兩條記錄的客戶 ID 或手機號碼字段具有相同的值。
檢查約束
CHECK 約束用於調節可以在特定列中輸入的值的允許範圍,從而維護其中存儲的數據的整體完整性和真實性。通過對特定列施加這樣的約束,人們可以限制它只接受那些已明確批准的值,從而提供額外的安全層以防止任何潛在的差異或未經授權的條目。
CHECK 約束要求將指定表中的每個指定行或記錄評估為真或未知。如果評估錯誤,數據庫將顯示錯誤通知。
為了根據年齡限制對某些客戶記錄的訪問,可以在給定關係數據庫管理系統(例如 PostgreSQL)的客戶表中使用檢查約束。這一限制要求所有尋求服務的個人至少年滿十八歲,從而阻止任何向未成年人提供服務的嘗試。下面以 SQL 代碼的形式說明了這一概念:
CREATE TABLE Customers (
ID int NOT NULL,
Age int CHECK(Age>=18),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
如果嘗試輸入低於 18 歲閾值的客戶年齡,
INSERT INTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 );
數據庫可能會顯示一條通知,表明存在問題,該通知可能類似於以下格式:
ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000)
如何在數據庫中添加和刪除 SQL 約束
SQL 約束提供的靈活性是一項寶貴的資產,因為它們可以通過使用 ALTER TABLE 語句進行修改。這個多功能命令使用戶能夠調整表的約束,以適應不斷變化的數據要求。
除了這裡提到的 SQL 約束之外,人們還可以探索一系列廣泛的約束來創建自定義數據庫。從本文中概述的內容開始將是一個合適的起點。