键 和 约束。
它们是关系数据库设计和数据完整性的核心概念,但侧重点不同:键 主要是一种标识机制,而约束 是一种强制规则的机制。键通常通过约束来实现。
键是表中用于唯一标识一条记录或建立表间关系的一列或多列的组合。
1. 主键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:将子表中的外键值设为 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(邮箱)如果都具备唯一且非空的特性,那么它们都是候选键。我们通常选择 StudentID 作为主键。Students(StudentID, Name, Email) 表中,(StudentID)、(StudentID, Name)、(Email)、(StudentID, Email) 都是超键。但只有 (StudentID) 和 (Email) 是候选键(最小超键)。CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY, -- 自增代理键
ProductCode VARCHAR(20) UNIQUE, -- 业务上的唯一编码
ProductName VARCHAR(200)
);
约束是应用于表列上的规则,用于限制其中可存储的数据,确保数据的准确性和可靠性。
1.NOT NULL 约束
NULL 值。CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL, -- 必须提供
LastName VARCHAR(50) NOT NULL,
MiddleName VARCHAR(50) -- 可以为NULL
);
UNIQUE 约束
UNIQUE 约束允许有 NULL 值(但通常只允许一个 NULL,取决于DBMS实现)。ALTER TABLE Students
ADD CONSTRAINT UQ_Student_Email UNIQUE (Email);
PRIMARY KEY 约束
NOT NULL 约束和 UNIQUE 约束的组合。用于定义主键。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'
);
| 特性 | 键 | 约束 |
|---|---|---|
| 本质 | 标识符,用于定位和关联数据。 | 规则,用于限制数据的有效性。 |
| 实现方式 | 键是通过约束(PRIMARY KEY, UNIQUE, FOREIGN KEY)在数据库层面实现的。 |
约束是更广泛的概念,包含了定义键的规则,也包括其他数据规则(CHECK, NOT NULL, DEFAULT)。 |
| 目的 | 结构性和关系性。定义表的结构(主键)和表之间的关系(外键)。 | 数据完整性和一致性。确保数据符合业务逻辑和规则。 |
| 类比 | 书的目录和页码(用于快速定位和建立关联)。 | 书的出版规范(如不能有错别字、章节顺序正确、符合排版规则)。 |
简单来说:
NOT NULL, CHECK, DEFAULT 只是“约束”,它们不定义键,只定义数据规则。NOT NULL 或 CHECK 约束。在实际的 SQL 语句中,你通常是在创建表 或修改表时,通过 CONSTRAINT 关键字来声明这些键和约束,数据库系统则会负责强制执行它们。