保障數(shù)據(jù)完整性:深入解析Oracle數(shù)據(jù)庫的主鍵和外鍵約束
主鍵和外鍵約束:主鍵約束用于唯一標(biāo)識數(shù)據(jù)庫表中的每一行數(shù)據(jù)。一個(gè)表只能有一個(gè)主鍵,且主鍵值不能為NULL。
示例:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(50)
);
外鍵約束用于確保表與其他表之間的關(guān)系的完整性。外鍵是一個(gè)表中的列,其值必須與另一個(gè)表中的主鍵或唯一鍵相匹配。
示例:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
唯一性約束:唯一性約束用于確保數(shù)據(jù)庫表中的某個(gè)列的值是唯一的。
示例:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(50),
Email VARCHAR(50) UNIQUE
);
默認(rèn)值和非空約束:默認(rèn)值約束用于為表中的某個(gè)列指定一個(gè)默認(rèn)值。
示例:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50),
Grade CHAR(1) DEFAULT 'A'
);
非空約束用于確保某個(gè)列不接受NULL值。
示例:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50) NOT NULL,
Price DECIMAL(10, 2)
);
CHECK約束:CHECK約束用于定義在插入或更新數(shù)據(jù)時(shí)必須滿足的條件。
示例:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
TotalAmount DECIMAL(10, 2),
CHECK (TotalAmount > 0)
);
數(shù)據(jù)類型約束:數(shù)據(jù)類型約束用于確保列中的數(shù)據(jù)與所定義的數(shù)據(jù)類型相匹配。
示例:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50),
Age INT CHECK (Age >= 0)
);
檢查約束:檢查約束允許在列級別定義一個(gè)條件,確保插入或更新的數(shù)據(jù)滿足指定的條件??梢允褂貌紶柋磉_(dá)式、比較運(yùn)算符和函數(shù)來定義檢查約束。
示例:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(50),
Salary DECIMAL(10, 2),
CONSTRAINT CHK_Salary CHECK (Salary > 0)
);
級聯(lián)約束:級聯(lián)約束是外鍵約束的一種擴(kuò)展,用于在主表的行被刪除或更新時(shí)自動處理相關(guān)的從表行??梢灾付壜?lián)刪除或級聯(lián)更新操作來維護(hù)數(shù)據(jù)一致性。
示例:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(50)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);
來自約束:來自約束("FROM" constraints)是一種基于表達(dá)式的約束,它可以通過一個(gè)查詢來定義約束條件。它允許將查詢結(jié)果用作約束條件。
示例:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
EmployeeName VARCHAR(50),
DepartmentID INT,
Salary DECIMAL(10, 2),
CONSTRAINT CHK_Salary CHECK (Salary > (SELECT AVG(Salary) FROM Employees))
);
域約束:域約束用于定義特定列的有效值范圍,它使用預(yù)定義的域(domain)來限制數(shù)據(jù)輸入。
示例:
CREATE DOMAIN AgeDomain AS INT
CHECK (VALUE >= 0 AND VALUE <= 120);
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50),
Age AgeDomain
);
這些約束類型的使用可以提供強(qiáng)大的數(shù)據(jù)驗(yàn)證和完整性保護(hù)機(jī)制。它們確保數(shù)據(jù)庫中存儲的數(shù)據(jù)符合預(yù)期的結(jié)構(gòu)和規(guī)則,并防止無效或不一致的數(shù)據(jù)被插入。通過合理應(yīng)用這些約束,可以提高數(shù)據(jù)庫的可靠性、性能和安全性。