ALTER TABLE 命令

ALTER TABLE 命令可以对表的列定义和约束进行动态修改。这包括扩展、修改或删除现有定义,将数据类型转换为其他类型,或根据新定义验证现有数据。

-- 修改列定义
ALTER TABLE <table_name> { ADD | ALTER } [ COLUMN ] <column_name> <column_definition>;
ALTER TABLE <table_name> { DROP        } [ COLUMN ] <column_name>;

-- 修改表约束
ALTER TABLE <table_name> { ADD | ALTER } CONSTRAINT <constraint_name> <constraint_definition>;
ALTER TABLE <table_name> { DROP        } CONSTRAINT <constraint_name>;

以下示例基于测试表 t1

CREATE TABLE t1 (
  id         NUMERIC  PRIMARY KEY,
  col_1      CHAR(4)
);

列操作

添加列

可以使用 ADD COLUMN 子句为现有表添加新列。在此子句中,可以使用 CREATE TABLE 语句中的所有选项,如数据类型、默认值、NOT NULL、主键、唯一约束、外键和检查约束。

-- 添加一个具有约束的新列
ALTER TABLE t1 ADD COLUMN col_2 VARCHAR(100) CHECK (length(col_2) > 5);
-- 提示:Oracle 不支持关键字 `COLUMN`。

修改列的特性

可以通过 ALTER COLUMN 子句更改现有列的一些特性,包括:

  • 数据类型
  • 默认值(DEFAULT 子句)
  • NOT NULL 子句

更改时,新定义必须与现有数据兼容。例如:

  • VARCHAR 转为 NUMERIC 需要所有现有数据都能成功转换,否则操作会失败(例如,'xyz' 无法转换)。
  • NUMERIC 转为 VARCHAR 时,只要 VARCHAR 的长度足够存储结果,转换就会成功。

提示: 一些数据库实现会忽略 SQL 标准的语法,改用其他关键字(如 MODIFY)。

-- 更改数据类型
ALTER TABLE t1 ALTER COLUMN col_1 SET DATA TYPE NUMERIC;

-- 更改默认值
ALTER TABLE t1 ALTER COLUMN col_1 SET DEFAULT 'n/a';

-- 设置或移除 NOT NULL
ALTER TABLE t1 ALTER COLUMN col_1 SET  NOT NULL;
ALTER TABLE t1 ALTER COLUMN col_1 DROP NOT NULL;

删除列

可以从现有表中删除列。

ALTER TABLE t1 DROP COLUMN col_2; 
-- 提示:在 Oracle 中,关键字 `COLUMN` 是强制性的。

提示: 一些数据库实现扩展了 SQL 标准,支持 RENAMESET INVISIBLE 命令。


表约束操作

添加表约束

可以为表添加约束,如主键、唯一约束、外键等。

ALTER TABLE t1 ADD CONSTRAINT t1_col_1_unique UNIQUE (col_1);

修改表约束

可以修改现有表约束。

ALTER TABLE t1 ALTER CONSTRAINT t1_col_1_unique UNIQUE (col_1);
-- 提示:某些实现可能不支持标准语法,而使用其他关键字(如 `MODIFY`)。

删除表约束

可以使用 DROP CONSTRAINT 删除表约束。

ALTER TABLE t1 DROP CONSTRAINT t1_col_1_unique;
-- 提示:MySQL 不支持标准语法,可使用 `DROP FOREIGN KEY` 或 `DROP INDEX` 替代。

提示: 一些数据库实现扩展了 SQL 标准,支持约束的 ENABLE / DISABLE 命令。

最后修改: 2025年01月28日 星期二 13:57