DB2 有数据的表新建(修改)自增长主键

数据库一般情况下会建一个ID为表主键表和一个业务外键CODE,这样对于数据库迁移会比较方便,提高数据库扩展性。但是遇到一个比较悲剧的是ID被当做业务主键使用了,而且已经有数据,所以只能用原有ID当业务主键使用,再新建一个表主键。因为DB2不支持直接建立一个自增长非空的属性。

 -- 删除主键
alter table DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION drop primary key 
GO
----创建副表
create table SYS_AUTH_LOG_USER_OPERATION_bak like SYS_AUTH_LOG_USER_OPERATION
GO
--将主表数据存入副表
insert into SYS_AUTH_LOG_USER_OPERATION_bak select * from SYS_AUTH_LOG_USER_OPERATIONGO
--重构表
call SYSPROC.ADMIN_CMD('reorg table SYS_AUTH_LOG_USER_OPERATION')
--删除主表数据
delete from SYS_AUTH_LOG_USER_OPERATION
GO
-- 增加TABLE_IDALTER TABLE DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION ADD COLUMN TABLE_ID BIGINT GOCOMMENT ON COLUMN "DB2ADMIN"."SYS_AUTH_LOG_USER_OPERATION"."TABLE_ID" IS '表主键id'
GO
-- 设置TABLE_ID不为空
Alter table DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION   alter column TABLE_ID  set not null
-- 设置自增长 注意起始值Alter table DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION alter column TABLE_ID set generated BY DEFAULT as identity (start with 1,increment by 1)
GO
--重构表 
call SYSPROC.ADMIN_CMD('reorg table SYS_AUTH_LOG_USER_OPERATION')
GO
--设置主键alter table DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION add constraint SYS_AUTH_LOG_USER_OPERATION_KEY primary key(TABLE_ID)
GO
--重置(需要先建立一个)
SEQUENCEALTER SEQUENCE TEMP RESTART with 1
GO
--将副表数据还原到主表INSERT INTO DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION(ID, USER_ID, OPERATION_TYPE, IP_ADDRESS, STATUS, LOGIN_IN_TIME, LOGIN_OUT_TIME, UPDATE_TIME, REMARK   , TABLE_ID
SELECT ID, USER_ID, OPERATION_TYPE, IP_ADDRESS, STATUS, LOGIN_IN_TIME, LOGIN_OUT_TIME, UPDATE_TIME, REMARK  ,  nextval for TEMP as id2    
FROM DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION_bak
GO
--删除副表
DROP TABLE DB2ADMIN.SYS_AUTH_LOG_USER_OPERATION_BAK
GO
--查询主表
select * from SYS_AUTH_LOG_USER_OPERATION
GO
--重构表
call SYSPROC.ADMIN_CMD('reorg table SYS_AUTH_LOG_USER_OPERATION')

--修改自增长开始值
alter table SYS_AUTH_LOG_USER_OPERATION alter TABLE_ID restart with 285 

红字为用 SEQUENCE 填充值,这一步突然想起来可以省去,因为TABLE_ID 已经是不为空的自增长了,数据库会自动插值,由于在家没法测试,大家可以自己尝试下。


猜你喜欢

转载自blog.csdn.net/lvsehuoyan/article/details/40226833