Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

sql

vertica

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!

like image 573
Michael Spector Avatar asked Mar 20 '23 01:03

Michael Spector


1 Answers

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.

like image 68
Kermit Avatar answered Mar 22 '23 21:03

Kermit