【问题标题】:Can one alter a PostgresSql table to have an autogenerated keys after the table has values?可以在表具有值后更改 PostgresSql 表以具有自动生成的键吗?
【发布时间】:2018-03-10 21:30:52
【问题描述】:

是否可以仅更改表以使现有列成为串行自动生成的键,而不添加新列?对不起,如果这个问题对于 PostgreSQL 来说有点新手,我更像是一个 SQL Server 人,但正在转向 PostgreSQL ..

简而言之,该程序会将现有的 SQL Server 数据库复制到 PostgreSQL 中。希望在 PostgreSQL 中拥有一个镜像数据库作为 SQL Server 的源,唯一需要注意的是,可以根据需要选择性地包含/排除任何表或列,或者做任何事情......

鉴于该过程会复制所有值,因此认为应该能够在复制完成后创建键,就像在 SQL Server 中所做的那样。认为 PostgreSQL 将具有与 SQL Server 的 SET INSERT_IDENTITY [ON|OFF] 类似的方法,因此可以用所需的值覆盖自动生成的键。在 PostgreSQL 中没有看到等价物。所以我的后备是在 Postgres 中创建镜像记录,没有键任何键,然后更改表。但它似乎根据需要修复了表,创建了一个新列,但是这样做会中断或导致修复 RI 以进行 PK/FK 关系的头痛。

有什么建议吗?提前致谢。

【问题讨论】:

    标签: sql-server postgresql database-design auto-increment alter


    【解决方案1】:

    在 PostgreSQL 中,如果您为其插入显式值,则自动生成的键总是被覆盖。如果不指定值(省略列),或指定关键字DEFAULT,则使用生成的键。

    给定表格

     CREATE TABLE t1 (id serial primary key, dat text);
    

    那么这两个都会从序列t1_id_seq中得到一个生成的密钥:

     INSERT INTO t1 (dat) VALUES ('fred');
     INSERT INTO t1 (id, dat) VALUES (DEFAULT, 'bob');
    

    这将提供自己的值:

     INSERT INTO t1 (id, dat) VALUES (42, 'joe');
    

    您有责任确保提供的值不会与现有数据或身份序列将生成的未来值冲突。 PostgreSQL不会注意到您手动插入了一个 ID 为 42 的行,并在其自己的序列计数器到达该点时跳过。

    通常您所做的是加载提供的值,然后将序列重置为表中已存在的所有键的最大值,因此它会继续从那里计数新的本地插入。

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2021-12-16
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多