2012-02-26 61 views
24

如何在表上創建序列以使其從0 - >最大值變爲? 我使用下面的SQL代碼試過,但它不會將任何值到表中,我使用:在現有表上創建序列

CREATE SEQUENCE rid_seq; 
ALTER TABLE test ADD COLUMN rid INTEGER; 
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq'); 

我想在插入序列表是從另一個查詢的輸出。我無法弄清楚在初始查詢期間添加序列還是在查詢執行後將序列添加到表格是否更有意義。

回答

-3

我不太熟悉postgresql,所以我不熟悉「CREATE SEQUENCE」語句。不過,我認爲你要正確添加列定義。但是,添加列不會自動爲現有行插入數據。 DEFAULT約束適用於新行。嘗試之後添加這樣的內容以填充現有行上的數據。

DECLARE @i Int 
SET @i = 0 
SET ROWCOUNT 1 
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN 
    UPDATE test SET rid = @i WHERE rid IS NULL 
END 
SET ROWCOUNT 0 
+0

感謝您的摘錄。當我嘗試運行它時遇到了語法錯誤:'at或near @'。我不熟悉Postgreqsl中的變量定義,所以我不確定是否有什麼明顯的東西需要改變。 – djq 2012-02-26 22:48:47

+0

(1)這看起來像SQL Server或可能MySQL語法,它不會在PostgreSQL中工作。 (2)一旦新行被添加,這會造成一些麻煩,因爲您沒有使用序列中的值,即使您已經使用了序列中的下一個值, rid'。 – 2012-02-26 23:00:47

+0

良好的捕獲,[太短](http://stackoverflow.com/users/479863/mu-is-too-short),關於不使用序列值。是的,我非常擅長編寫MS SQL Server代碼(我將以這種方式處理這些代碼),並且對PostgreSQL根本不熟悉。我試圖提出的一點是定義一個約束和應用它的區別,upvoted的答案解釋得比我好。 – 2012-02-27 14:52:18

37

設置默認值,當您添加新列:

create sequence rid_seq; 
alter table test add column rid integer default nextval('rid_seq'); 

改變現有列的默認值不改變現有的數據,因爲該數據庫沒有辦法知道哪些值應該改變;在列值上沒有「此列具有默認值」標誌,只有默認值(原來是NULL,因爲您沒有指定其他任何內容)和當前值(也是NULL),但是可以區分「NULL因爲它是默認的「和」NULL,因爲它被顯式設置爲NULL「。所以,當你這樣做的兩個步驟:

  1. 添加列。
  2. 更改默認值。

PostgreSQL不會將默認值應用於剛剛添加的列。但是,如果添加列並在同一時間提供默認值,則PostgreSQL會知道哪些行具有默認值(所有這些行),因此可以在列添加時提供值。

順便說一句,你可能想在該列太NOT NULL:

create sequence rid_seq; 
alter table test add column rid integer not null default nextval('rid_seq'); 

而且,作爲a_horse_with_no_name筆記,如果你只打算使用rid_seqtest.rid列,那麼你可能想set its owner columntest.rid因此,如果列被刪除的順序將被丟棄:

alter sequence rid_seq owned by test.rid; 
+3

您可能還想讓該列成爲序列的「所有者」,以便PostgreSQL知道它屬於那一列:'alter sequence rid_sequence owner to test.rid' – 2012-02-26 23:20:10

+0

是否可以在現有表中創建像「REQ0001-REQ000N」這樣的自定義序列值? – Angger 2017-09-25 05:10:07

+0

@Angger序列是數字,所以不是真的。您可以通過串聯兩列來僞造它,或者將串與一個獨立序列串聯起來。 – 2017-09-25 05:46:10

1

在PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence') 
WHERE your_column IS NULL;