在pgsql中,有没有办法获得一个包含多个值的表,并选择其中一个(比如,other_id),找出它的最高值是什么,并使每个放入表中的新条目从中增加值。
我认为这很容易让人有机会工作......
ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL
____________________________________
ERROR: type "serial" does not exist
非常感谢任何见解!
答案 0 :(得分:29)
查看datatype serial的postgresql文档。串口只是空手而已。
CREATE TABLE tablename (
colname SERIAL
);
相当于指定:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
答案 1 :(得分:14)
快速浏览docs会告诉您
数据类型smallserial, serial 和bigserial 不是真正的类型 但仅仅是创建唯一标识符列的标记方便
如果要使现有(整数)列作为“串行”工作,只需手动创建序列(名称是任意的),将其当前值设置为当前{的最大值(或更大值) {1}}值,将其设置为address.new_id
列的默认值。
要设置序列的值,请参阅here。
address.new_id
这只是一个示例,使用您自己的序列名称(任意,您创建它),以及一个大于列最大当前值的数字。
更新:正如Lucas的回答(应该是被接受者)所指出的那样,您还应该使用SELECT setval('address_new_id_seq', 10000);
答案 2 :(得分:2)
之所以发生这种情况,是因为只有在创建新表或向表中添加新列时才可以使用 serial 数据类型。如果您尝试使用此数据类型更改现有表,则会收到错误消息。因为 serial 不是真正的数据类型,而只是更长的查询的缩写或别名。
如果您希望达到相同的效果,正如您在更改现有表时使用串行数据类型所期望的那样,可以这样做:
CREATE SEQUENCE my_serial AS integer START 1 OWNED BY address.new_id;
ALTER TABLE address ALTER COLUMN new_id SET DEFAULT nextval('my_serial');
查询的第一行创建您自己的名称为 my_serial 的序列。 OWEND BY 语句将新创建的序列与表的确切列相连接。在您的确切情况下,表是 address ,列是 new_id 。 START 语句定义此序列应从哪个值开始。
第二行使用新的默认值更改表格,该默认值将由先前创建的顺序决定。
它将为您带来与使用串行设备相同的结果。