如何转换数据库列类型而不丢失任何现有数据?

时间:2018-05-08 01:25:03

标签: postgresql ddl alter-table

我想更改已有一些数据的列的数据类型。数据不应丢失。我该如何转换它?

1 个答案:

答案 0 :(得分:1)

您可以使用简单的ALTER TABLE语句。

如果无法使用现有强制转换转换为新值,则必须指定一个USING子句,告诉PostgreSQL如何转换值:

ALTER TABLE <tabname> ALTER <colname>
   SET DATA TYPE <newtype> USING <expression>;

让我们举一个例子。假设我们有这个表:

CREATE TABLE changeme(
   id integer PRIMARY KEY,
   d timestamp with time zone NOT NULL
);

它包含几行:

INSERT INTO changeme VALUES (1, current_timestamp);
INSERT INTO changeme VALUES (2, current_timestamp);

现在我们要将列d转换为bigint,其中包含自epoch以来的秒数。

然后我们可以这样做:

ALTER TABLE changeme ALTER d
   SET DATA TYPE bigint USING CAST(extract(epoch FROM d) AS bigint);