PostgreSQL - ALTER TABLE 命令
PostgreSQL - ALTER TABLE 命令
Section titled “PostgreSQL - ALTER TABLE 命令”PostgreSQL 的 ALTER TABLE 命令用于更改现有表的定义。这个强大的命令允许你添加、删除或修改列,以及添加、移除或修改表约束。在 PostgreSQL 中,大多数 DDL(数据定义语言)命令,例如 ALTER TABLE,都是事务性的。这意味着你可以将它们封装在 BEGIN/COMMIT 块中,以便一次应用多个更改,或者在出现问题时使用 ROLLBACK 回滚。
注意:修改大型表有时会锁定该表,阻止读写操作。对于生产系统,请考虑使用专用工具或策略,例如针对每条语句的超时设置(SET lock_timeout),以实现零停机迁移。
以下是最常见的列相关操作。
1. 添加新列
ALTER TABLE table_name ADD COLUMN column_name datatype [column_constraint];
-- 示例:向 'employees' 表添加 'hire_date' 列ALTER TABLE employees ADD COLUMN hire_date DATE;2. 删除列
ALTER TABLE table_name DROP COLUMN [IF EXISTS] column_name;
-- 示例:删除 'gender' 列ALTER TABLE employees DROP COLUMN IF EXISTS gender;3. 重命名列
ALTER TABLE table_name RENAME COLUMN old_name TO new_name;
-- 示例:将 'salary' 重命名为 'annual_salary'ALTER TABLE employees RENAME COLUMN salary TO annual_salary;4. 更改列的数据类型
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_datatype [USING expression];
-- 示例:将员工 ID 更改为更大的整型ALTER TABLE employees ALTER COLUMN id TYPE BIGINT;
-- 示例(带类型转换):将文本列更改为整型ALTER TABLE employees ALTER COLUMN employee_code TYPE INT USING employee_code::integer;5. 设置/移除默认值
-- 设置默认值ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT default_value;
-- 移除默认值ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;
-- 示例:为新员工设置默认状态ALTER TABLE employees ALTER COLUMN status SET DEFAULT 'active';约束强制执行数据完整性规则。它们可以随时添加或移除。
1. 添加 NOT NULL 约束
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;
-- 示例:将 'name' 列设置为必填ALTER TABLE employees ALTER COLUMN name SET NOT NULL;2. 添加 UNIQUE 约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ...);
-- 示例:确保所有员工的电子邮件地址都是唯一的ALTER TABLE employees ADD CONSTRAINT uq_employees_email UNIQUE (email);3. 添加 PRIMARY KEY 约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column1, ...);
-- 示例:为没有主键的表添加主键ALTER TABLE departments ADD CONSTRAINT pk_departments PRIMARY KEY (id);4. 添加 FOREIGN KEY 约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_name)REFERENCES other_table (other_column_name);
-- 示例:将员工链接到其部门ALTER TABLE employees ADD CONSTRAINT fk_employees_departmentFOREIGN KEY (department_id) REFERENCES departments (id);5. 添加 CHECK 约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (condition);
-- 示例:确保薪资始终为正数ALTER TABLE employees ADD CONSTRAINT chk_salary_positive CHECK (annual_salary > 0);6. 删除任意约束
ALTER TABLE table_name DROP CONSTRAINT [IF EXISTS] constraint_name;
-- 示例:移除唯一的电子邮件约束ALTER TABLE employees DROP CONSTRAINT IF EXISTS uq_employees_email;