3.1、约束条件

1、约束条件

约束是应用于表列或整个表的规则,用于限制可以存入的数据类型。如果存在违反约束的数据行为,该行为会被数据库阻止。

约束类型关键字作用是否允许 NULL
主键约束 PRIMARY KEY 唯一标识每一行,不允许重复和空值,一张表只能有一个主键(可由多列组成,称为复合主键) ❌ 不允许
唯一约束 UNIQUE 确保列(或列组合)的值唯一 ✅ 允许(但通常只允许一个 NULL)
非空约束 NOT NULL 强制列必须有值,禁止插入或更新为 NULL。一张表可有多个 UNIQUE 约束 ❌ 不允许
检查约束 CHECK 用于限制列中值的范围,确保列中的值满足特定的条件。如果条件不满足,则数据无法插入或更新。 取决于条件
默认值约束 DEFAULT 为列设置一个默认值。当插入新行而未给该列指定值时,插入默认值 —(提供默认值)
外键约束 FOREIGN KEY 建立表与表的关联关系。它指向另一个表的主键。它确保了参照完整性:确保子表中的值必须存在于父表的主键(或唯一键)中,维护引用完整性。 ✅ 允许(除非同时有 NOT NULL
例子:
-- 功能:创建新表
  -- CREATE TABLE - 创建表关键字
  -- employees - 表名称
  -- 列定义部分:定义每个字段的属性
CREATE TABLE employees (
    -- PRIMARY KEY: 主键,唯一标识每行记录
    -- AUTO_INCREMENT: 自动增长,常用于ID字段
    employee_id INT PRIMARY KEY AUTO_INCREMENT,
    
    -- VARCHAR(50): 可变长度字符串,最大50字符
    -- NOT NULL: 该字段必须填写,不能为空
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    
    -- UNIQUE: 唯一约束,该列所有值必须不同
    email VARCHAR(100) UNIQUE,
    
    -- DEFAULT: 默认值,插入数据时如果未指定则使用此值
    hire_date DATE DEFAULT CURRENT_DATE,
    
    -- DECIMAL(10,2): 精确小数,共10位,小数占2位
    -- CHECK: 检查约束,确保数据符合特定条件
    salary DECIMAL(10,2) CHECK (salary > 0),
    
    -- FOREIGN KEY: 外键,引用另一个表的主键
    -- REFERENCES: 指定被引用的表和字段
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

主键和外键

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50) NOT NULL
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    dept_id INT,
    
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
        ON DELETE SET NULL    -- 部门删除后,员工部门置空
        ON UPDATE CASCADE     -- 部门ID更新时,员工同步更新
);

添加约束(ALTER TABLE)

-- 添加非空
ALTER TABLE users ALTER COLUMN email SET NOT NULL;  -- PostgreSQL
ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL; -- MySQL

-- 添加外键
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);

删除约束

-- 删除外键(需知道约束名)
ALTER TABLE orders DROP CONSTRAINT fk_customer;  -- SQL Server / PostgreSQL
ALTER TABLE orders DROP FOREIGN KEY fk_customer; -- MySQL

查看约束名:

PostgreSQL: \d table_name
MySQL: SHOW CREATE TABLE table_name;
SQL Server: 查询 INFORMATION_SCHEMA.TABLE_CONSTRAINTS

 

posted @ 2025-11-19 15:51  chao_xiong  阅读(7)  评论(0)    收藏  举报