在表具有值后,可以更改PostgresSql表以获得自动生成的密钥吗?

时间:2017-09-29 02:39:55

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

是否可以仅更改表以使现有列成为串行自动生成的密钥,而无需添加新列?很抱歉,如果这个问题对于PostgreSQL来说有点新手,我更多的是SQL Server人员,但转向PostgreSQL ..

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

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

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

1 个答案:

答案 0 :(得分:0)

在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将注意到您手动插入了一个标识为42的行,并在其自己的序列计数器到达该点时跳过。

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