【问题标题】:Derby alter existing column of empty table to be identityDerby 将空表的现有列更改为标识
【发布时间】:2019-04-29 16:34:27
【问题描述】:

我正在尝试以下方法:

psAddPK = conn.prepareStatement("ALTER TABLE users ALTER usr    
                      GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)");        

psAddPK.execute(); 

但是得到

java.sql.SQLSyntaxErrorException:语法错误:遇到“GENERATED”

在创建 usr 时定义为 NOT NULL

【问题讨论】:

    标签: java derby auto-increment identity


    【解决方案1】:

    您无法更改列以将其重新定义为身份,您必须从一开始就将其创建为身份列。或者您可以删除该列,然后将其重新添加为身份。

    Here's the Derby Alter table spec

    ALTER TABLE 语句允许您:

    • 向表中添加列
    • 向表中添加约束 从表中删除一列
    • 从表中删除现有约束
    • 增加 VARCHAR 或 VARCHAR FOR BIT DATA 列的宽度
    • 覆盖表的行级锁定(或删除覆盖)
    • 更改标识列的增量值和起始值
    • 更改列的可空性约束
    • 更改列的默认值

    语法:

    ALTER TABLE table-name
    {
        ADD COLUMN column-definition |
        ADD CONSTRAINT clause |
        DROP [ COLUMN ] column-name [ CASCADE | RESTRICT ]
        DROP { PRIMARY KEY | FOREIGN KEY constraint-name | UNIQUE 
         constraint-name | CHECK constraint-name | CONSTRAINT constraint-name }
        ALTER [ COLUMN ] column-alteration |
        LOCKSIZE { ROW | TABLE }
    }
    

    列更改

    column-name SET DATA TYPE VARCHAR(integer) |
    column-name SET DATA TYPE VARCHAR FOR BIT DATA(integer) |
    column-name SET INCREMENT BY integer-constant |
    column-name RESTART WITH integer-constant |
    column-name [ NOT ] NULL |
    column-name [ WITH | SET ] DEFAULT default-value |
    column-name DROP DEFAULT
    

    列定义

    simple-column-name [ data-type ]
    [ column-level-constraint ]*
    [ [ WITH ] DEFAULT default-constant-expression
      | generation-clause
    ]
    

    【讨论】:

    • 能够在不放弃的情况下进行更改会很好。这并不重要,但是当您删除然后重新添加时,该列最终会出现在记录的末尾。有什么方法可以将其保持在位置 1 而不必删除所有列?
    • 我看不到。对不起。
    猜你喜欢
    • 2014-01-24
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多