键 和 约束。
它们是关系数据库设计和数据完整性的核心概念,但侧重点不同:键 主要是一种标识机制,而约束 是一种强制规则的机制。键通常通过约束来实现。
键是表中用于唯一标识一条记录或建立表间关系的一列或多列的组合。
NULL
CREATE TABLE Students ( StudentID INT PRIMARY KEY, -- 将StudentID列定义为主键 Name VARCHAR(100), Email VARCHAR(100) ); -- 或使用表级约束 CREATE TABLE Students ( StudentID INT, CourseID INT, Grade CHAR(2), PRIMARY KEY (StudentID, CourseID) -- 复合主键 );
CASCADE
SET NULL
SET DEFAULT
RESTRICT
NO ACTION
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, -- 该列将作为外键 OrderDate DATE, FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE -- 当客户被删除,其所有订单也被级联删除 );
Students
StudentID
Email
Students(StudentID, Name, Email)
(StudentID)
(StudentID, Name)
(Email)
(StudentID, Email)
CREATE TABLE Products ( ProductID INT IDENTITY(1,1) PRIMARY KEY, -- 自增代理键 ProductCode VARCHAR(20) UNIQUE, -- 业务上的唯一编码 ProductName VARCHAR(200) );
约束是应用于表列上的规则,用于限制其中可存储的数据,确保数据的准确性和可靠性。
NOT NULL
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, -- 必须提供 LastName VARCHAR(50) NOT NULL, MiddleName VARCHAR(50) -- 可以为NULL );
UNIQUE
ALTER TABLE Students ADD CONSTRAINT UQ_Student_Email UNIQUE (Email);
PRIMARY KEY
FOREIGN KEY
CHECK
CREATE TABLE Products ( ProductID INT PRIMARY KEY, Price DECIMAL(10,2) CHECK (Price >= 0), -- 列级CHECK约束 StockQuantity INT NOT NULL, CONSTRAINT CHK_Stock CHECK (StockQuantity >= 0 AND StockQuantity <= 1000) -- 表级CHECK约束 );
DEFAULT
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, OrderDate DATE DEFAULT GETDATE(), -- 默认为当前系统日期 Status VARCHAR(20) DEFAULT 'Pending' );
简单来说:
在实际的 SQL 语句中,你通常是在创建表 或修改表时,通过 CONSTRAINT 关键字来声明这些键和约束,数据库系统则会负责强制执行它们。
CONSTRAINT