跳转到主要内容
模块 9 · 第 3 课(共 4)课程中的35/57~10 min
模块课程(3/4)

更改结构:ALTER TABLE

应用程序的需求随着时间的推移而变化,数据库必须跟上。 ALTER TABLE 是一个(极其通用)命令,专用于修改现有表模式,而无需删除它们(冒着内部数据风险)。

修改列(添加/删除/更改)

添加列需要小心。如果表已经包含数据,添加“NOT NULL”列将在 Postgres 中引发错误:它应该在旧行中插入什么?您必须关联 DEFAULT。

SQL
-- Aggiungiamo una colonna
ALTER TABLE users ADD COLUMN age INTEGER; -- Ok, sarà NULL ovunque

-- Aggiungiamo NOT NULL, quindi diamogli un deafult
ALTER TABLE users ADD COLUMN active BOOLEAN NOT NULL DEFAULT true;

-- Cancellare una colonna (ATTENZIONE! i dati andranno persi)
ALTER TABLE users DROP COLUMN age;

不仅仅是添加或删除:您经常需要重新配置列的type或其约束之一:

SQL
-- Cambia il tipo di dato (postgreSQL farà un 'cast' dei dati esistenti se possibile)
ALTER TABLE users ALTER COLUMN username TYPE VARCHAR(100);

-- Aggiunge il vincolo NOT NULL
ALTER TABLE users ALTER COLUMN username SET NOT NULL;

-- Rimuove il vincolo NOT NULL (ritorna ad accettare null)
ALTER TABLE users ALTER COLUMN username DROP NOT NULL;

在运行时添加约束

就像使用 CREATE TABLE 一样,我们可以使用 ALTER TABLE 将 CONSTRAINT 附加到生产应用程序中已使用的表。

SQL
-- Aggiungi un nuovo Foreign Key
ALTER TABLE orders
  ADD CONSTRAINT fk_order_status FOREIGN KEY (status_id) REFERENCES statuses(id);

-- Aggiungi un CHECK
ALTER TABLE products
  ADD CONSTRAINT price_positive CHECK (price > 0);

-- E per distruggerli?
ALTER TABLE products DROP CONSTRAINT price_positive;

重命名

列和表都可以重命名:

SQL
ALTER TABLE users RENAME TO auth_users;
ALTER TABLE auth_users RENAME COLUMN username TO login_name;

尝试一下

锻炼#sql.m9.l3.e1
尝试:0加载中...

“产品”表当前有一个“名称”列。通过将“名称”列重命名为“标题”来修改表。使用重命名列操作。

正在加载编辑器...
显示提示

语法:ALTER TABLE ... RENAME COLUMN ... TO ...

3 次尝试后可用的解决方案

在后期制作中添加约束

锻炼#sql.m9.l3.e2
尝试:0加载中...

通过添加 CHECK 约束(名为“verifica_prezzo”)来修改“products”表,该约束要求价格(“price”列)大于 0。添加约束时必须不删除原始列。

正在加载编辑器...
显示提示

语法: ALTER TABLE 表 ADD CONSTRAINT name CHECK (...)

3 次尝试后可用的解决方案