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
本文来自博客园,作者:chao_xiong,转载请注明原文链接:https://www.cnblogs.com/chao-xiong/p/19242904

浙公网安备 33010602011771号