DB2将自动增量列添加到现有表

时间:2016-02-17 12:52:59

标签: sql db2 auto-increment dbmigrate

我的DB2数据库中有一个包含以下模式的表。

CREATE TABLE IDN_OAUTH_CONSUMER_APPS (
        CONSUMER_KEY VARCHAR (255) NOT NULL,
        CONSUMER_SECRET VARCHAR (512),
        USERNAME VARCHAR (255),
        TENANT_ID INTEGER DEFAULT 0,
        APP_NAME VARCHAR (255),
        OAUTH_VERSION VARCHAR (128),
        CALLBACK_URL VARCHAR (1024),
        GRANT_TYPES VARCHAR (1024)
/

我需要添加一个类型为integer的新列ID,而不是自动增量,并将其作为主键。如何在不删除表的情况下执行此操作?

7 个答案:

答案 0 :(得分:2)

使用多步骤方法:

  1. 仅使用整数数据类型添加列ALTER TABLE ADD...并将其添加为可为空的
  2. 更新表以设置该列的预期标识值
  3. 更改表格以添加自动生成
  4. 更改表以在该列上添加主键
  5. 您需要执行多个步骤,因为需要手动添加标识值。 Syntax and examples for ALTER TABLE can be found here

答案 1 :(得分:2)

我可以使用以下一组查询成功完成此操作。

ALTER TABLE IDN_OAUTH_CONSUMER_APPS ADD COLUMN ID INTEGER NOT NULL DEFAULT 0

CREATE SEQUENCE IDN_OAUTH_CONSUMER_APPS_SEQUENCE START WITH 1 INCREMENT BY 1 NOCACHE

CREATE TRIGGER IDN_OAUTH_CONSUMER_APPS_TRIGGER NO CASCADE BEFORE INSERT ON IDN_OAUTH_CONSUMER_APPS REFERENCING NEW AS NEW FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SET (NEW.ID) = (NEXTVAL FOR IDN_OAUTH_CONSUMER_APPS_SEQUENCE); END

REORG TABLE IDN_OAUTH_CONSUMER_APPS

UPDATE IDN_OAUTH_CONSUMER_APPS SET ID = IDN_OAUTH_CONSUMER_APPS_SEQUENCE.NEXTVAL

然后使用alter table添加主键。

答案 2 :(得分:1)

有一种简单的方法可以做到这一点。只需运行上述改动:

ALTER TABLE idn_oauth_consumer_apps ADD COLUMN id INTEGER NOT NULL DEFAULT 0;
ALTER TABLE idn_oauth_consumer_apps ALTER COLUMN id SET GENERATED ALWAYS AS IDENTITY;

即使在大桌子上也很简单快捷。测试并使用DB2 for i V7R2。

答案 3 :(得分:0)

使用主键字段创建新表。插入旧表中的记录。删除旧表,如果可以,请重命名新表。如果您无法重命名,请重新创建它并从现有记录中填充。

答案 4 :(得分:0)

Chamila Wijayarathna's answer为基础,我使用了以下内容:

ALTER TABLE IDN_OAUTH_CONSUMER_APPS ADD COLUMN ID INTEGER NOT NULL DEFAULT 0

CREATE SEQUENCE IDN_OAUTH_CONSUMER_APPS_ID_SEQUENCE START WITH 1 INCREMENT BY 1 NOCACHE

CREATE TRIGGER IDN_OAUTH_CONSUMER_APPS_ID_TRIGGER NO CASCADE BEFORE INSERT ON
  IDN_OAUTH_CONSUMER_APPS REFERENCING NEW AS NEW
  FOR EACH ROW MODE DB2SQL BEGIN ATOMIC SET (NEW.ID) = (NEXTVAL FOR
  IDN_OAUTH_CONSUMER_APPS_ID_SEQUENCE); END

REORG TABLE IDN_OAUTH_CONSUMER_APPS

UPDATE IDN_OAUTH_CONSUMER_APPS SET ID = IDN_OAUTH_CONSUMER_APPS_ID_SEQUENCE.NEXTVAL

ALTER TABLE IDN_OAUTH_CONSUMER_APPS ADD PRIMARY KEY (ID)

REORG TABLE IDN_OAUTH_CONSUMER_APPS

然后反转:

REORG TABLE IDN_OAUTH_CONSUMER_APPS

ALTER TABLE IDN_OAUTH_CONSUMER_APPS DROP PRIMARY KEY

DROP TRIGGER IDN_OAUTH_CONSUMER_APPS_ID_TRIGGER

DROP SEQUENCE IDN_OAUTH_CONSUMER_APPS_ID_SEQUENCE

ALTER TABLE IDN_OAUTH_CONSUMER_APPS DROP COLUMN ID

REORG TABLE IDN_OAUTH_CONSUMER_APPS

答案 5 :(得分:0)

在DB2 for z / OS v12上对此进行了尝试,并且有效:

alter table TABLE_NAME add column id integer generated always as identity

答案 6 :(得分:0)

我推荐使用这种方法。它不需要创建任何卫星对象 - 没有触发器、序列等......

alter table test.test2  add column id integer not null default 0;
alter table test.test2 alter column id drop default;
alter table test.test2  alter column id set generated always as identity;
call sysproc.admin_cmd ('reorg table test.test2');
update  test.test2 set id = default;
commit;

如果使用“db2”cli,则可以直接运行 reorg 命令,而无需“调用 sysproc.admin_cmd”包装器。