2013-05-10 96 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