Skip to content

约束: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:设置为 NULL
  • RESTRICT:拒绝操作(默认)
  • 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 '%@%')
);

练习 ​

  1. 创建带主键的表
  2. 创建外键关联两个表
  3. 测试外键的 CASCADE 选项
  4. 添加唯一约束
  5. 添加检查约束(年龄 >= 18)
  6. 使用默认值
  7. 命名约束
  8. 删除和添加约束

完成练习后,打开本章答案页核对。

下一步 ​

下一节学习范式化:如何设计良好的数据库结构。

回到第七章概览 · 返回SQL 学习路线

用心记录每一步成长