想象一下,你正在为大学设计数据库。一开始,学生表只有两个字段:ID 和名字。很简单,学生们开始用系统。可过了一个月,老师们来找你说:“能不能再加个年龄字段?”,再过一会儿:“还需要 email 字段。” 然后又说:“要不把 middle_name 字段删了吧,反正没人填!” 这时候你就会用到 ALTER TABLE 来加列和删列的技能啦。
添加列的语法
所以,要在 PostgreSQL 现有表里加新列,用的就是 ALTER TABLE 命令。来看下语法:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— 你想加新列的表名。column_name— 你要加的列名。data_type— 数据类型,比如VARCHAR、INTEGER或DATE。constraints(可选参数)— 你想给这个列加的限制,比如NOT NULL、DEFAULT等等。
例子:加一个新列
假设我们有个之前建好的 students 表:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
突然有需求要加一个 age 列来存学生年龄。这样写就行:
ALTER TABLE students
ADD COLUMN age INTEGER;
现在 students 表的结构变成这样:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
如果你插入新数据时没写年龄,PostgreSQL 会自动给 age 赋值 NULL,因为我们没加 NOT NULL 或默认值(DEFAULT)之类的限制。
删除列的语法
删表里的列也是用 ALTER TABLE 命令。语法如下:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— 你想删列的表名。column_name— 要删的列名。RESTRICT— 如果有引用就禁止删除(默认)。CASCADE— 连带所有依赖一起删。
关于级联删除依赖,我下个 level 再细说 :P
例子:删掉不需要的列
回到 students 表。我们决定 age 字段不需要了。删掉它:
ALTER TABLE students
DROP COLUMN age;
现在表结构又变简单了:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
实用例子
加带限制的列
如果你想加 age 列,但要加 NOT NULL 限制和默认值?可以这样写:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
现在所有已有行的 age 都会变成 18,以后插入新数据时,age 必须有值,除非用默认值。
删除有依赖的列
如果某个列有依赖(比如被视图或触发器用到),你得用 CASCADE 修饰符。但要小心:这可能会影响你库里的其他对象。比如:
ALTER TABLE students
DROP COLUMN email CASCADE;
常见错误和注意点
错误:加列时类型不对。
比如你加了个 INTEGER 列,却想往里存文本。PostgreSQL 不认,会在插入时报错。数据类型一定要和内容对得上。
错误:删列时没考虑依赖。
比如你删了个被索引或外键引用的列,PostgreSQL 会报错,除非你加了 CASCADE 修饰符。
错误:删有依赖的列。 比如你删了个被索引或外键引用的列,PostgreSQL 会报错,除非你加了 CASCADE 修饰符。你加了它,结果把几千行引用你那列的数据都删了。其实根本不该删 : (
注意点:操作顺序。
有时候加带限制的列要注意操作顺序。比如你加 NOT NULL 的列,得先给它填默认值,不然 PostgreSQL 会报错。
GO TO FULL VERSION