跳转至

约束(CONSTRAINT)

约束用于 保证数据的正确性与一致性

约束类型 说明 示例
PRIMARY KEY 主键,唯一标识一条记录 PRIMARY KEY (id)
UNIQUE 唯一约束,防止重复 UNIQUE (列名)
NOT NULL 不允许为空 name VARCHAR(30) NOT NULL
DEFAULT 默认值 status VARCHAR(10) DEFAULT 'active'
CHECK 检查条件(部分数据库支持) CHECK (age >= 0)
FOREIGN KEY 外键,建立表之间的关系 FOREIGN KEY (dept_id) REFERENCES department(id)

创建表时直接定义约束(CREATE TABLE)

在创建表时,可以直接定义各类约束,无需使用 ALTER TABLE。 在MySQL / PostgreSQL / SqlServe / Oracle中语法相同


1️⃣ PRIMARY KEY(主键)

  • 普通定义
    CREATE TABLE 表名 (
        id INT PRIMARY KEY,
        name VARCHAR(50)
    );
  • 命名定义
    CREATE TABLE 表名 (
        id INT,
        name VARCHAR(50),
        CONSTRAINT pk_表名 PRIMARY KEY (id)
    );

2️⃣ UNIQUE(唯一约束)

  • 普通定义
    CREATE TABLE 表名 (
        name VARCHAR(100) UNIQUE
    );
  • 命名定义
    CREATE TABLE 表名 (
        name VARCHAR(100),
        CONSTRAINT uq_列名 UNIQUE (列名)
    );

3️⃣ NOT NULL(非空约束)

NOT NULL 作为列属性定义,不支持命名。

  • 通用语法
CREATE TABLE 表名 (
    name VARCHAR(50) NOT NULL,
    age INT
);

4️⃣ DEFAULT(默认值)

  • 普通定义
    CREATE TABLE 表名 (
        name VARCHAR(50),
        status VARCHAR(10) DEFAULT 'active'
    );
  • 命名定义
    CREATE TABLE 表名 (
        name NVARCHAR(50),
        status NVARCHAR(10) CONSTRAINT df_status DEFAULT 'active'
    );

5️⃣ CHECK(检查约束)

  • 普通定义
    CREATE TABLE 表名 (
        age INT CHECK (age >= 0)
    );
  • 命名定义
    CREATE TABLE 表名 (
        age INT,
        CONSTRAINT ck_age CHECK (age >= 0)
    );

6️⃣ FOREIGN KEY(外键)

  • 普通定义
    CREATE TABLE 表名 (
        id INT PRIMARY KEY,
        dept_id INT,
        FOREIGN KEY (dept_id) REFERENCES 其他表(主键列)
    );
  • 命名定义
    CREATE TABLE 表名 (
        id INT PRIMARY KEY,
        dept_id INT,
        CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES department(id)
    );

添加(ADD)

1. PRIMARY KEY(主键)

MySQL / Oracle / SQL Server / PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ADD PRIMARY KEY (列名);
  • 命名语法
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (列名);

2. UNIQUE(唯一)

MySQL / Oracle / SQL Server / PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ADD UNIQUE (列名);
  • 命名语法
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名);

3. NOT NULL(非空)

说明:NOT NULL 为列属性,不支持“命名约束”。

MySQL / Oracle

  • 普通语法
    ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL;

SQL Server / PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ALTER COLUMN 列名 数据类型 NOT NULL;

4. DEFAULT(默认值)

MySQL

  • 普通语法
    ALTER TABLE 表名 MODIFY 列名 数据类型 DEFAULT 'active';
    
    ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默认值;
  • 命名语法
    • 不支持命名 DEFAULT。

SQL Server

  • 普通语法
    ALTER TABLE 表名 ADD DEFAULT 默认值 FOR 列名;
  • 命名语法
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 DEFAULT 默认值 FOR 列名;

PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默认值;
  • 命名语法
    • 不支持命名 DEFAULT。

Oracle

  • 普通语法
    ALTER TABLE 表名 MODIFY 列名 DEFAULT 默认值;
  • 命名语法
    • 不支持命名 DEFAULT(作为列属性保存)。

5. CHECK(检查约束)

MySQL /SQL Server/PostGreSql / Oracle

  • 普通语法
    ALTER TABLE 表名 ADD CHECK (条件表达式);
  • 命名语法
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK (条件表达式);

6. FOREIGN KEY(外键)

MySQL / SQL Server / PostGreSql / Oracle

  • 普通语法
    ALTER TABLE 表名 ADD FOREIGN KEY (列名) REFERENCES 关联表(关联列);
  • 命名语法
    ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (列名) REFERENCES 关联表(关联列);

备注与命名建议

  • 常用命名前缀:
    • 主键:pk_表名
    • 唯一:uq_列名
    • 外键:fk_列名
    • 检查:ck_列名
    • 默认:df_列名
  • NOT NULL/DEFAULT 在 MySQL、PostgreSQL、Oracle 中本质是 列属性,不可命名(SQL Server 的 DEFAULT 可命名)。

修改(MODIFY / ALTER)

大多数约束“修改”需要 先删除原约束,再按新的定义添加。下面给出通用方式与各库要点。

PRIMARY KEY(主键)

  • 通用思路
-- 先删除,再新增
(见“删除 PRIMARY KEY”)
(见“添加 PRIMARY KEY”)

UNIQUE(唯一)

  • 通用思路
-- 先删除旧唯一,再新增新唯一
(见“删除 UNIQUE”)
(见“添加 UNIQUE”)

NOT NULL(非空)

  • 通用语法 MySQL / Oracle:
    ALTER TABLE 表名 MODIFY 列名 新数据类型 [NOT NULL | NULL];

SQL Server:

    ALTER TABLE 表名 ALTER COLUMN 列名 新数据类型 [NOT NULL | NULL];

PostgreSQL:

    ALTER TABLE 表名 ALTER COLUMN 列名 [SET NOT NULL | DROP NOT NULL];

DEFAULT(默认值)

  • 通用思路
    • MySQL / PostgreSQL:直接 SET DEFAULT 改值;或 DROP DEFAULT 后再 SET DEFAULT
    • SQL Server:需先 DROP CONSTRAINT 再以新值 ADD CONSTRAINT DEFAULT
    • Oracle:直接 MODIFY 列名 DEFAULT 新值

CHECK(检查)

  • 通用思路
  -- 先 DROP 旧检查,再 ADD 新检查
  (见“删除 CHECK”)
  (见“添加 CHECK”)

FOREIGN KEY(外键)

  • 通用思路
  -- 先 DROP 外键,再 ADD 外键(含 ON DELETE/UPDATE 规则)
  (见“删除 FOREIGN KEY”)
  (见“添加 FOREIGN KEY”)

删除(DROP)

PRIMARY KEY

MySQL

  • 普通语法
    ALTER TABLE 表名 DROP PRIMARY KEY;

SQL Server/PostgreSQL/Oracle

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP CONSTRAINT 约束名;

UNIQUE

mysql

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP INDEX 约束名;

Oracle/SQL Server/PostgreSQL

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP CONSTRAINT 约束名;

NOT NULL

mysql/Oracle

  • 普通语法
    ALTER TABLE 表名 MODIFY 列名 数据类型 NULL;

SQL Server/PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ALTER COLUMN 列名 数据类型 NULL;

DEFAULT

MySQL/PostgreSQL

  • 普通语法
    ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;

SQLServer

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP CONSTRAINT 约束名;

oracle

  • 普通语法
    ALTER TABLE 表名 MODIFY 列名 DEFAULT NULL;  -- 通过设为 NULL 清除默认值

CHECK

MySQL / SQLServer / PostgreSQL / Oracle

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP CONSTRAINT 约束名;

FOREIGN KEY

mysql

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP FOREIGN KEY 约束名;

SQL Server / PostgreSQL / Oracle

  • 普通 / 命名语法
    ALTER TABLE 表名 DROP CONSTRAINT 约束名;