當(dāng)談到Oracle數(shù)據(jù)庫的數(shù)據(jù)完整性和約束時(shí),有幾種關(guān)鍵的約束類型需要考慮。這些約束確保了數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)的一致性、完整性和準(zhǔn)確性。以下是Oracle中常見的約束類型的詳細(xì)講解:
主鍵和外鍵約束:
主鍵約束用于唯一標(biāo)識(shí)數(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)
);
檢查約束:
檢查約束允許在列級(jí)別定義一個(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)
);
級(jí)聯(lián)約束:
級(jí)聯(lián)約束是外鍵約束的一種擴(kuò)展,用于在主表的行被刪除或更新時(shí)自動(dòng)處理相關(guān)的從表行。可以指定級(jí)聯(lián)刪除或級(jí)聯(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ù)庫中存儲(chǔ)的數(shù)據(jù)符合預(yù)期的結(jié)構(gòu)和規(guī)則,并防止無效或不一致的數(shù)據(jù)被插入。通過合理應(yīng)用這些約束,可以提高數(shù)據(jù)庫的可靠性、性能和安全性。