现在该聊聊怎么改已经存在的表了。在项目开发中,需求总是说变就变——就像“bombardilokrokodilo”突然空降一样。比如,产品经理突然想让每个用户都要有一个唯一的喜欢的个人资料背景色 ID。或者你发现 VARCHAR(50) 根本不够存名字,因为数据库里已经有个叫“Bombardilokrokodilo-Junior-Third”的用户了。
好在 PostgreSQL 有个专门干这事儿的工具——ALTER TABLE 命令。
ALTER TABLE 这条命令可以 修改已经存在的表结构。你可以用它:
- 添加新列;
- 删除不需要的列;
- 修改列的数据类型;
- 重命名表或它的列;
- 添加或删除约束,比如
NOT NULL、UNIQUE,还有更多。
可以这么理解:你已经盖好了房子(表),但现在想加个新房间(列)或者拆掉没用的储藏室(删列)。
ALTER TABLE 的语法
命令的基本结构其实挺直观的:
ALTER TABLE 表名
修改动作;
这里:
表名—— 你想要修改的表的名字;-
修改动作—— 你具体想干啥(比如加列、删列或者改数据类型)。
ALTER TABLE 的用法例子
添加新列
如果你想在表里加个新列,用 ADD COLUMN。比如:
ALTER TABLE students
ADD COLUMN email VARCHAR(100);
这条命令会在 students 表里加一个新列 email,用来存学生的邮箱地址。这个列的数据类型是最大 100 个字符的字符串。
假如你建了学生表,但忘了加入入学日期的信息。可以这样补救:
ALTER TABLE students
ADD COLUMN enrollment_date DATE;
现在你有了 enrollment_date 这个列,可以存入学日期了。
删除列
如果你觉得某个列没用了,用 DROP COLUMN。比如:
ALTER TABLE students
DROP COLUMN email;
这条命令会把 students 表里的 email 列删掉。注意,这个列里的数据也会被 彻底删除,无法恢复。
重点提醒:
如果你想删的列在别的表里被用作外键,PostgreSQL 可能会报错。这种情况要先把依赖删掉。
修改列的数据类型
有时候你一开始选的数据类型不合适。比如你本来想用 SMALLINT 存学生年龄,后来发现不够用,想换成 BIGINT。可以这样:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
重点提醒: 如果这个列里已经有数据,PostgreSQL 会检查能不能转换成新类型。如果不行,就会报错。
比如你把 description 列建成了 VARCHAR(100),后来发现课程描述可能很长。可以把类型改成 TEXT:
ALTER TABLE courses
ALTER COLUMN description TYPE TEXT;
现在你可以随便存课程描述了,不用担心长度限制。
重命名列
如果你想改列名,用 RENAME COLUMN:
ALTER TABLE students
RENAME COLUMN name TO full_name;
现在 name 这个列就叫 full_name 了。
重命名表
你也可以改表名。用 RENAME TO:
ALTER TABLE students
RENAME TO university_students;
现在 students 这个表就叫 university_students 了。
设置/删除 NOT NULL 约束
假如你建了个列,但忘了设成必填(NOT NULL)。没关系!你可以后面加上:
ALTER TABLE students
ALTER COLUMN name SET NOT NULL;
如果想去掉 NOT NULL 约束,用 DROP NOT NULL:
ALTER TABLE students
ALTER COLUMN name DROP NOT NULL;
设置默认值
如果列已经存在,但你想给它设个默认值,用 SET DEFAULT:
ALTER TABLE enrollments
ALTER COLUMN enrollment_date SET DEFAULT CURRENT_DATE;
要去掉默认值,就这样:
ALTER TABLE enrollments
ALTER COLUMN enrollment_date DROP DEFAULT;
后面几节课我们会详细讲每条命令,敬请期待 :)
用 ALTER TABLE 时常见的坑
用 ALTER TABLE 的时候可能会遇到各种报错。最常见的有:
试图把数据类型改成和现有数据不兼容的类型。 比如 age 列里已经有数据,你想把它变成 VARCHAR 字符串,这就会报错。解决办法:先删掉或转换数据。
试图删除被当作外键或索引的列。 PostgreSQL 不让你这么干,是为了保证数据完整性。要删这种列,得先把关联关系删掉。
语法错误。 ALTER TABLE 虽然很灵活,但语法要求很严。比如 ADD COLUMN 必须带上数据类型。
实际应用场景
在真实开发中,ALTER TABLE 用得特别多。比如:
- 给已有表加新数据(比如新列);
- 优化数据库(比如改数据类型让内存占用更小);
- 修正设计失误(比如一开始忘了加约束或者选错了数据类型)。
现在你应该明白 ALTER TABLE 有多强大了吧。这是个能帮你应对项目变化的利器。最重要的是——操作时一定要小心,别一不小心“拆了房子”(你的表),只为了加个新房间。
GO TO FULL VERSION