我有一个oracle存储库启动并运行,并且已经说了1000万条记录。其中一个表是
CREATE TABLE TABLE_A
NAME VARCHAR2(128),
VER VARCHAR2(128),
TYPE VARCHAR2(32),
DESCRIPTION VARCHAR2(256),
CONSTRAINT TABLE_A_PK PRIMARY KEY ("NAME","VERSION");
此表正在使用很长时间,现在说我需要更改主键约束。现在我需要让另一列说ID和主键是NAME,VER,TYPE和LANG的组合。
在升级脚本中,我可以使用
EXECUTE IMMEDIATE
ALTER TABLE TABLE_A ADD LANG VARCHAR2(32);
EXECUTE IMMEDIATE
UPDATE TABLE TABLE_A SET LANG ='|| 'en_US';
EXECUTE IMMEDIATE
UPDATE TABLE TABLE_A SET TYPE='||'n/a'||' WHERE TYPE IS NULL;
在TYPE之前可以有值,有时候为null。因为升级后它的主键部分不能为空,所以如果它为null则使其成为n / a。
但是对于1000万条记录做上述事情需要至少5小时的升级停机时间。有没有其他方法可以将前一列作为主键,但仍然不需要太多停机时间。 如果我的方法错了,请建议我。在此先感谢
答案 0 :(得分:0)
首先,我不明白为什么要使用EXECUTE IMMEDIATE。
然后,如何使用Enabled Novalidated Constraints创建PK,它将应用于新插入的行,但不适用于旧的行。像这样,您可以运行批处理来修改现有数据以提交新PK。 了解更多 : http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/data_acc.htm#i6516
对于LANG列,您还可以给出默认值:
ALTER TABLE TABLE_A ADD LANG VARCHAR2(32) default 'en_US';
然后
ALTER TABLE TABLE_A MODIFY LANG VARCHAR2(32) default null;
尼古拉斯。
答案 1 :(得分:0)
当前主键将具有支持索引,该索引可能是NAME / VERSION上的唯一索引。
添加列后,您可以在这四列上创建唯一索引。然后替换主键约束,删除旧索引(如果在删除PK约束时不自动执行此操作)并使用新创建的索引。
它不会缩短总时间,因为它可以让你将整个操作分解为5个1小时的步骤,而不是一个5小时的步骤。