2013-05-10 103 views
18

在pgsql中,有没有办法让表中有多个值,然后选择其中的一个(比如other_id),找出它的最高值,并将每个新条目放在表中从该值增加。将列的数据类型更改为串行

我想这只是太容易有工作的机会..

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL 

____________________________________ 
ERROR: type "serial" does not exist 

感谢任何见解!

+1

也许你能解释一点,为什么你需要一个新的序列标识符添加到可能已经有一个主键的表?你想用串行标识符替换现有的主键吗?这一切的背景是什么? – 2013-05-10 03:50:08

+0

@CraigRinger在我最后一个问题中,我无法导入数据库。我决定,因为我的系统需要一些重要的升级,所以要在明天的工作时间处理。我只需要访问几个表格。所以我带了一张桌子,但是在表格中控制增量列的顺序是导致传输问题的原因。我没有运气改变列作为主键,所以我想我可以使它成为一个“串行”,从表的当前最高值开始。做一个新的col,并使其成为PrimKey会更容易吗? – 1252748 2013-05-10 04:06:11

+0

最好链接到相关背景下需要的任何以前的问题。你怎么“转移”它? “没有任何运气”在某种意义上?确切的命令,确切的错误消息等。 – 2013-05-10 04:08:19

回答

12

docs快速浏览告诉你,

The data types smallserial, serial and bigserial are not true types but merely a notational convenience for creating unique identifier columns

如果你想使现有的(整数)列“串行”,只是手动创建序列工作(任意名称),请将其当前值设置为当前address.new_id值的最大值(或更大值),并将其设置为address.new_id列的默认值。

要设置序列的值,请参见here

SELECT setval('address_new_id_seq', 10000);

这只是一个例子,使用自己的序列的名字(任意的,你创建一个),以及一些比你列的最大电流值。


更新:由卢卡斯的回答中指出(这应该是acccepted一个),你也应该指定的列序‘属于’使用CREATE/ALTER SEQUENCE ... OWNED BY ...

+0

好的。 “设置序列的当前值”是什么意思?我现在正在观察序列,但它们对我来说是新的。你的意思是说,通过一个序列,我可以创建自己的“唯一标识符列的标记便利”? – 1252748 2013-05-10 03:39:18

+0

串行(伪)类型的列只是一个整数列,它具有某个序列的值作为默认值(并将其递增)。我添加了声明来设置值。 – leonbloy 2013-05-10 03:46:45

25

查找到PostgreSQL文档datatype serial。串行只是简短的。

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; 
+0

我应该提到,这是一个快速修复,直到我可以升级我的(只是发现如何)古老版本的Postgre。当我尝试做'OWNED BY'时,我得到一个语法错误.. – 1252748 2013-05-10 04:08:10

+0

@thomas,那么你的postgres版本是什么? – Lucas 2013-05-10 04:48:36