Is there a way to set AUTO_INCREMENT property on existing table column in Vertica?

StackOverflow https://stackoverflow.com/questions/22741980

  •  24-06-2023
  •  | 
  •  

Domanda

Suppose I have a simple table:

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

Is there a way to alter this table so id will become AUTO_INCREMENT field?

I tried the following with no luck:

  • ALTER TABLE (no such syntax)
  • Creating another table with auto increment ID, and copying the data from the original one (didn't work because of the error: Cannot insert into or update IDENTITY/AUTO_INCREMENT column "id")

Thanks!

È stato utile?

Soluzione

I would try to just rank the rows, and use the sequence for future inserts.

\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;

We get:

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

Success!

Let's prepare the table for future inserts:

-- 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');

Quick test:

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

SELECT * FROM t2;

We get:

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

Hope this helps.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top