2014-03-30 115 views
4

假設我有一個簡單的表:有沒有辦法在Vertica的現有表列上設置AUTO_INCREMENT屬性?

CREATE TABLE user(
    id INT NOT NULL PRIMARY KEY, 
    name VARCHAR(32) NOT NULL, 
) 

有沒有辦法改變這個表,所以id將成爲AUTO_INCREMENT領域?

我試過,沒有運氣以下:

  • ALTER TABLE(沒有這樣的語法)
  • 創建具有自動遞增ID另一個表,並從原來的複製數據(沒有工作,因爲的錯誤:無法插入或更新IDENTITY/AUTO_INCREMENT列「ID」)

謝謝!

回答

6

我會嘗試僅對行進行排序,並使用未來插入的序列。

\set AUTOCOMMIT 'on' 

CREATE TABLE t1 (
    val char(1) 
); 

INSERT INTO t1 VALUES ('a'); 
INSERT INTO t1 VALUES ('b'); 
INSERT INTO t1 VALUES ('c'); 
INSERT INTO t1 VALUES ('d'); 

CREATE TABLE t2 (
    id int, 
    val char(1) 
); 

INSERT INTO t2 (val, id) 
SELECT val, RANK() OVER (ORDER BY val) as id 
FROM t1; 

SELECT * FROM t2; 

我們得到:

 id | val 
----+----- 
    1 | a 
    3 | c 
    2 | b 
    4 | d

成功!

讓我們準備表未來刀片:

-- get the value to start sequence at 
SELECT MAX(id) FROM t2; 

-- create the sequence 
CREATE SEQUENCE seq1 START 5; 

-- syntax as of 6.1 
-- modify the column to add next value for future rows 
ALTER TABLE t2 ALTER COLUMN id SET DEFAULT NEXTVAL('seq1'); 

快速測試:

INSERT INTO t2 (val) VALUES ('e'); 
INSERT INTO t2 (val) VALUES ('f'); 

SELECT * FROM t2; 

我們得到:

 id | val 
----+----- 
    4 | d 
    2 | b 
    3 | c 
    6 | f 
    1 | a 
    5 | e

希望這有助於。

相關問題