【问题标题】:Creating table, copying over field with no data, then copying over data in next fields创建表,复制没有数据的字段,然后复制下一个字段中的数据
【发布时间】:2018-03-21 01:56:26
【问题描述】:

我有一个名为 mytable 的表,它有四个字段(id、field2、field3、field4)。

我想创建另一个名为 tablecopy 的表,它将从 mytable 中获取组件。在一个字段中,我只想复制 mytable 中的列名和 pk 约束。然后在 tablecopy 的其他字段中,我想从 mytable 复制“field2”和“field3”(带有数据)。

这就是我正在使用的东西。

CREATE TABLE mycopy (LIKE mytable INCLUDING ALL);

INSERT INTO mycopy
SELECT field2, field3 FROM mytable;

问题是 field2 是一个不同的字符,它试图将它放在我的 id 字段中。我希望从 id 开始的下一列中的 field2。该 id 字段不应包含任何数据。

对此的任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以在mycopy 表中指定要插入field2field3 的列:

    INSERT INTO mycopy (field2, field3)
    SELECT field2, field3
    FROM mytable;
    

    这是INSERT INTO ... SELECT 的首选方式,原因有几个。即使您没有指定目标列而侥幸成功,但稍后如果表结构发生变化,或者有人进行了清理,脚本可能会突然停止按您的预期工作。此外,通过显式指定目标列,您可以让任何继承您的代码的人都清楚。

    编辑:如果您希望 Postgres 自动填充 mycopy 表中的 Id 列,那么您的表定义应如下所示:

    CREATE TABLE mycopy (
        Id  SERIAL PRIMARY KEY,
        field1 TEXT NOT NULL,
        field2 TEXT NOT NULL,
        field3 TEXT NOT NULL
    );
    

    现在 Postgres 会在您插入数据时自动增加 Id 列。

    【讨论】:

    • 好的 Tim 所以我应该使用我想要的列名来创建 mycopy,然后运行这个查询?
    • @Nick 是的,这对我来说听起来很合理。如果您遇到困难,请使用该信息编辑您的问题。
    • 它不像我想要的那样工作。 Id 列现在是空白的,并且 field2 和 field3 在 mycopy 中(这是我想要的)。问题是我无法在该 id 列中输入任何内容
    • Id应该为空,因为您没有为其分配任何数据。您很可能打算将 Id 设为自动递增列。
    • 做到了,蒂姆!非常感谢。我试图弄清楚这一点一段时间。我知道 Id 列将是空白的,但我不知道我无法在这些单元格中输入任何内容。不过,您的自动增量解决了这个问题。
    【解决方案2】:
    INSERT INTO mycopy
    (a_column, other_column)
    SELECT field2, field3 FROM mytable;
    

    您需要按照与您的选择语句列相同的顺序定义要插入的列名。

    【讨论】:

    • nitsram,那不是把mytable的field2放到mycopy的id列吗?我不想要那个
    • 你是对的!我已将其更改为更通用。谢谢。
    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2019-05-17
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多