【问题标题】:Is there a way to set AUTO_INCREMENT property on existing table column in Vertica?有没有办法在 Vertica 中的现有表列上设置 AUTO_INCREMENT 属性?
【发布时间】:2014-03-30 08:41:54
【问题描述】:

假设我有一个简单的表格:

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

有没有办法改变这个表,所以id 将成为 AUTO_INCREMENT 字段?

我尝试了以下方法,但没有成功:

  • ALTER TABLE(没有这样的语法)
  • 使用自动增量 ID 创建另一个表,并从原始表复制数据(由于错误:无法插入或更新 IDENTITY/AUTO_INCREMENT 列“id”)

谢谢!

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    我会尝试仅对行进行排名,并将序列用于 future 插入。

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

    我们得到:

     标识 |值
    -+-----
      1 |一个
      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;
    

    我们得到:

     标识 |值
    -+-----
      4 | d
      2 | b
      3 | C
      6 | F
      1 |一个
      5 | e

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多