【问题标题】:How to convert database column type without losing any existing data?如何在不丢失任何现有数据的情况下转换数据库列类型?
【发布时间】:2018-05-08 01:25:02
【问题描述】:

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

【问题讨论】:

  • alter table alter column。仅当类型不兼容时,数据才会丢失。
  • edit您的问题并添加当前表定义(作为create table 语句)和所需的新数据类型。一般来说,更改类型不会导致任何数据丢失。 (edit 你的问题,不要在 cmets 和no screen shots 中使用邮政编码。

标签: postgresql ddl alter-table


【解决方案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 转换为包含自epoch 以来的秒数的bigint

那么我们可以这样做:

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

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2020-11-20
    • 2015-07-03
    • 2011-08-02
    • 2012-04-30
    • 2017-04-07
    相关资源
    最近更新 更多