ALTER TABLE
语句更改目录中现有表的模式。
Examples
CREATE TABLE integers (i INTEGER, j INTEGER);
向表 integers
添加一个名为 k
的新列,它将填充默认值 NULL
:
ALTER TABLE integers ADD COLUMN k INTEGER;
向表 integers 添加一个名为 l
的新列,它将填充默认值 10:
ALTER TABLE integers ADD COLUMN l INTEGER DEFAULT 10;
从表 integers 中删除列 k
:
ALTER TABLE integers DROP k;
将列 i
的类型更改为 VARCHAR
类型,使用标准转换:
ALTER TABLE integers ALTER i TYPE VARCHAR;
将列 i
的类型更改为 VARCHAR
类型,使用指定的表达式转换每行的数据:
ALTER TABLE integers ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);
设置列的默认值:
ALTER TABLE integers ALTER COLUMN i SET DEFAULT 10;
删除列的默认值:
ALTER TABLE integers ALTER COLUMN i DROP DEFAULT;
使列不可为空:
ALTER TABLE integers ALTER COLUMN i SET NOT NULL;
删除非NULL
约束:
ALTER TABLE integers ALTER COLUMN i DROP NOT NULL;
重命名表:
ALTER TABLE integers RENAME TO integers_old;
重命名表的列:
ALTER TABLE integers RENAME i TO ii;
向表的列添加主键:
ALTER TABLE integers ADD PRIMARY KEY (i);
Syntax
ALTER TABLE
修改现有表的模式。
ALTER TABLE
所做的所有更改完全遵循事务语义,即它们在提交之前对其他事务不可见,并且可以通过回滚完全撤销。
RENAME TABLE
重命名表:
ALTER TABLE integers RENAME TO integers_old;
RENAME TO
子句重命名整个表,更改其在模式中的名称。请注意,依赖该表的任何视图不会自动更新。
RENAME COLUMN
重命名表的列:
ALTER TABLE integers RENAME i TO j;
ALTER TABLE integers RENAME COLUMN j TO k;
RENAME COLUMN
子句用于重命名表中的单个列。任何依赖此名称的约束(例如,CHECK
约束)都会自动更新。但是,请注意,任何依赖此列名的视图不会自动更新。
ADD COLUMN
Add a new column with name k
to the table integers
, it will be filled with the default value NULL:
ALTER TABLE integers ADD COLUMN k INTEGER;
Add a new column with name l
to the table integers, it will be filled with the default value 10:
ALTER TABLE integers ADD COLUMN l INTEGER DEFAULT 10;
ADD COLUMN
子句可用于向表中添加指定类型的新列。新列将填充指定的默认值,如果未指定,则填充 NULL
。
DROP COLUMN
Drop the column k
from the table integers
:
ALTER TABLE integers DROP k;
DROP COLUMN
子句可用于从表中删除列。请注意,只有在列没有任何依赖的索引时才能删除列。这包括作为PRIMARY KEY
或UNIQUE
约束的一部分创建的任何索引。作为多列检查约束的一部分的列也不能被删除。
如果您尝试删除带有索引的列,DuckDB 将返回以下错误消息:
Dependency Error: Cannot alter entry "..." because there are entries that depend on it.
ALTER TYPE
Change the type of the column i
to the type VARCHAR
using a standard cast:
ALTER TABLE integers ALTER i TYPE VARCHAR;
Change the type of the column i
to the type VARCHAR
, using the specified expression to convert the data for each row:
ALTER TABLE integers ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);
SET DATA TYPE
子句用于更改表中列的数据类型。列中的任何数据将根据 USING
子句中提供的表达式进行转换,如果 USING
子句不存在,则直接转换为新的数据类型。请注意,只有在列没有任何依赖的索引且不属于任何 CHECK
约束时,才能更改其数据类型。
SET
/ DROP DEFAULT
设置列的默认值:
ALTER TABLE integers ALTER COLUMN i SET DEFAULT 10;
删除列的默认值:
ALTER TABLE integers ALTER COLUMN i DROP DEFAULT;
SET/DROP DEFAULT
子句修改现有列的 DEFAULT
值。请注意,这不会修改列中的任何现有数据。删除默认值等同于将默认值设置为 NULL。
警告 目前,如果存在任何依赖关系,DuckDB 将不允许您更改表。这意味着如果您在列上有索引,您首先需要删除索引,更改表,然后重新创建索引。否则,您将收到一个
Dependency Error
。
ADD PRIMARY KEY
向表的列添加主键:
ALTER TABLE integers ADD PRIMARY KEY (i);
向表的多个列添加主键:
ALTER TABLE integers ADD PRIMARY KEY (i, j);
ADD
/ DROP CONSTRAINT
ADD CONSTRAINT
和DROP CONSTRAINT
子句在 DuckDB 中尚未支持。