约束:PRIMARY KEY、FOREIGN KEY、CHECK
PRIMARY KEY:主键
唯一标识每一行,不能为 NULL。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255)
);
-- 或
CREATE TABLE users (
id INT,
email VARCHAR(255),
PRIMARY KEY (id)
);
-- 复合主键
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);FOREIGN KEY:外键
引用其他表的主键,保证引用完整性。
sql
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 级联操作
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- 删除用户时删除订单
ON UPDATE CASCADE -- 更新用户 ID 时更新订单
);级联选项:
CASCADE:级联删除/更新SET NULL:设置为 NULLRESTRICT:拒绝操作(默认)NO ACTION:延迟检查
UNIQUE:唯一约束
确保列值唯一,允许 NULL。
sql
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
-- 复合唯一约束
CREATE TABLE enrollments (
student_id INT,
course_id INT,
UNIQUE (student_id, course_id)
);NOT NULL:非空约束
sql
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255) NOT NULL
);CHECK:检查约束
自定义验证规则。
sql
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10,2) CHECK (price >= 0),
stock INT CHECK (stock >= 0)
);
-- 复杂检查
CREATE TABLE users (
id INT PRIMARY KEY,
age INT CHECK (age >= 18 AND age <= 100)
);DEFAULT:默认值
sql
CREATE TABLE orders (
id INT PRIMARY KEY,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);添加约束(ALTER TABLE)
sql
-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);
-- 添加外键
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
-- 添加唯一约束
ALTER TABLE users ADD UNIQUE (email);
-- 添加检查约束
ALTER TABLE products ADD CHECK (price >= 0);
-- 删除约束
ALTER TABLE users DROP CONSTRAINT users_email_key;命名约束
sql
CREATE TABLE users (
id INT,
email VARCHAR(255),
CONSTRAINT pk_users PRIMARY KEY (id),
CONSTRAINT uk_email UNIQUE (email),
CONSTRAINT chk_email CHECK (email LIKE '%@%')
);练习
- 创建带主键的表
- 创建外键关联两个表
- 测试外键的 CASCADE 选项
- 添加唯一约束
- 添加检查约束(年龄 >= 18)
- 使用默认值
- 命名约束
- 删除和添加约束
完成练习后,打开本章答案页核对。
下一步
下一节学习范式化:如何设计良好的数据库结构。