可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13

ALTER TABLE .. ADD COLUMN .. FIRST, BEFORE, AFTER

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

大多数 RDBMS 维护表中列的逻辑顺序和物理顺序。虽然物理顺序(列值在磁盘块中的存储方式)是 SQL 语言隐藏的实现细节,但逻辑顺序与许多 SQL 功能相关,包括

  • SELECT * 语法的行为(* 根据表中列的逻辑顺序展开)
  • 客户端语言(如 PL/SQL)在使用 TABLE%ROWTYPE 和类似语法时将数据存储在记录表示中
  • 像 jOOQ 这样的库会将此排序用于代码生成 记录等等
  • 客户端应用程序和 SQL 编辑器(如 Dbeaver)将以声明的逻辑列顺序显示结果

所有 RDBMS 都将维护在 CREATE TABLE 语句 中声明的逻辑列顺序,并在使用 ALTER TABLE .. ADD COLUMN 语句 时将新列追加到表的末尾。

但只有少数 RDBMS 允许在创建表后修改逻辑列位置。这可以使用以下语法之一完成

// Adding a single column and specify its position
create.alterTable("table").add("column", INTEGER).after("other_column").execute();
create.alterTable("table").add("column", INTEGER).before("other_column").execute();
create.alterTable("table").add("column", INTEGER).first().execute();

AFTER

AFTER 子句允许指定新列将被添加到哪个列之后。

方言支持

此示例使用 jOOQ

alterTable("t").add("c", INTEGER).after("other")

翻译成以下特定方言的表达式

Aurora MySQL, H2, MariaDB, MemSQL, MySQL

ALTER TABLE t ADD c int AFTER other

ClickHouse

ALTER TABLE t ADD COLUMN c Nullable(integer) AFTER other

Databricks

ALTER TABLE t ADD COLUMN (c int AFTER other)

ASE, Access, Aurora Postgres, BigQuery, CockroachDB, DB2, Derby, DuckDB, Exasol, Firebird, HSQLDB, Hana, Informix, Oracle, Postgres, Redshift, SQLDataWarehouse, SQLServer, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica, YugabyteDB

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

BEFORE

BEFORE 子句允许指定新列将被添加到哪个列之前。

方言支持

此示例使用 jOOQ

alterTable("t").add("c", INTEGER).before("other")

翻译成以下特定方言的表达式

H2, HSQLDB

ALTER TABLE t ADD c int BEFORE other

ASE, Access, Aurora MySQL, Aurora Postgres, BigQuery, ClickHouse, CockroachDB, DB2, Databricks, Derby, DuckDB, Exasol, Firebird, Hana, Informix, MariaDB, MemSQL, MySQL, Oracle, Postgres, Redshift, SQLDataWarehouse, SQLServer, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica, YugabyteDB

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

FIRST

FIRST 子句允许指定新列将被添加到所有其他列之前。

方言支持

此示例使用 jOOQ

alterTable("t").add("c", INTEGER).first()

翻译成以下特定方言的表达式

Aurora MySQL, H2, MariaDB, MemSQL, MySQL

ALTER TABLE t ADD c int FIRST

ClickHouse

ALTER TABLE t ADD COLUMN c Nullable(integer) FIRST

Databricks

ALTER TABLE t ADD COLUMN (c int FIRST)

Firebird

EXECUTE BLOCK
AS
BEGIN
  EXECUTE STATEMENT '
    ALTER TABLE t ADD c integer
  ';
  EXECUTE STATEMENT '
    ALTER TABLE t ALTER c POSITION 1
  ';
END

ASE, Access, Aurora Postgres, BigQuery, CockroachDB, DB2, Derby, DuckDB, Exasol, HSQLDB, Hana, Informix, Oracle, Postgres, Redshift, SQLDataWarehouse, SQLServer, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica, YugabyteDB

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意听到!

The jOOQ Logo