CodeGym /课程 /SQL SELF /在表中添加和删除列

在表中添加和删除列

SQL SELF
第 18 级, 课程 0
可用

想象一下,你正在为大学设计数据库。一开始,学生表只有两个字段: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 会报错。

2
任务
SQL SELF, 第 18 级, 课程 0
已锁定
添加新列
添加新列
2
任务
SQL SELF, 第 18 级, 课程 0
已锁定
添加带有约束的新列
添加带有约束的新列
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION