是否可以仅更改表以使现有列成为串行自动生成的密钥,而无需添加新列?很抱歉,如果这个问题对于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关系。
有什么建议吗?提前谢谢。
答案 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
的行,并在其自己的序列计数器到达该点时跳过。
通常你要做的是用提供的值加载,然后将序列重置为表中已有的所有键的最大值,因此它会从那里继续计算新的本地插入。