2015-03-19 18 views
0

它关于ORACLE(PL/SQL)脚本。说实话,我对数据库并不是很熟悉。 我想修改一列中字符串的长度从30到60.它不是空列。 如果表是空的,我运行下面的脚本,然后它的工作原理:更改表中有无数据的列长度

alter table [TABLE_NAME] add (NEW_COLUMN NVARCHAR2(60) DEFAULT 'null' NOT NULL); 
/
alter table [TABLE_NAME] DROP CONSTRAINT PK_[TABLE_NAME]; 
/
begin 
    for rec in (select * from [TABLE_NAME]) 
    loop 
     update [TABLE_NAME] set NEW_COLUMN =rec.OLD_COLUMN where Name_ID=rec.Name_ID; 
    end loop; 
end; 
/
alter table [TABLE_NAME] drop column OLD_COLUMN; 
/
alter table [TABLE_NAME] rename column NEW_COLUMN to OLD_COLUMN; 
/
alter table [TABLE_NAME] add CONSTRAINT PK_[TABLE_NAME] PRIMARY KEY(Name_ID); 
/

但是,如果表中有值,则该脚本不起作用。 它给出了错误:不能约束 - 不存在约束

但是,如果我删除有关约束(第二个和第二个最后)的行,那么它的工作原理。 现在我不知道该表是空的还是会有数据,所以我需要一个脚本,可以在两种情况下工作。任何人都可以帮忙吗?

创建表以下脚本:

CREATE TABLE TABLE_NAME 
(
Name_ID NVARCHAR2(7) NOT NULL, 
OLD_COLUMN NVARCHAR2(30) NOT NULL, 
CONSTRAINT PK_TABLE_NAME PRIMARY KEY(Name_ID, OLD_COLUMN) 
) 
/

所以在创建表,它把主键约束,但在更新表则丢弃该约束莫名其妙。我在这里简单地谈论这个观点。这些表是通过Java代码更新的。我需要做的是制作一个适用于这两种情况的脚本 - 使用数据或在创建表格和修改列之后。

+0

请修改您的问题以包含创建表(包括约束)脚本,以便我们至少可以复制您的特定场景。另外,你为什么要在PL/SQL中进行更新?这样做会让事情复杂化并放慢速度。相反,为什么不只是:'update table_name set new_column = old_column;',然后是显式的'commit;'? – Boneist 2015-03-19 11:58:36

+0

另外,“脚本不起作用”是什么意思?它错误吗?如果是这样,你会得到什么错误? – Boneist 2015-03-19 12:00:10

+0

我认为错误是'rec中的空格。 OLD_COLUMN';顺便说一句。你应该像Boneist所做的那样进行更新,不要忘记'commit' – 2015-03-19 12:04:26

回答

0

下面的脚本对我的作品,无论插入语句是否存在或不存在(即表已经或没有数据。):

CREATE TABLE TABLE_NAME 
(
Name_ID NVARCHAR2(7) NOT NULL, 
OLD_COLUMN NVARCHAR2(30) NOT NULL, 
CONSTRAINT PK_TABLE_NAME PRIMARY KEY(Name_ID, OLD_COLUMN) 
); 

insert into table_name (name_id, old_column) 
values ('test', 'test_old_col'); 

commit; 

alter table table_name add (new_column nvarchar2(60) default 'null' not null); 

update table_name set new_column = old_column; 

commit; 

alter table table_name drop constraint PK_TABLE_NAME; 

alter table table_name drop column old_column; 

alter table table_name rename column new_column to old_column; 

alter table TABLE_NAME add CONSTRAINT PK_TABLE_NAME PRIMARY KEY(Name_ID, old_column); 

drop table table_name; 

我假定你的意思是重新创建主键中包含old_column,否则如果name_id列中存在任何重复值,则无法重新创建它。

+0

好的。它的工作现在。我不确定在复制值之前是否放弃约束引发了这个问题。你也建议以不同的方式复制这些值。谢谢。 – Charychap 2015-03-19 13:55:50

+0

它不会做,不;该约束对new_column的内容没有影响。我刚把这个约束的下降移到了逻辑上最接近的地方(至少对我来说!) - 就在列的下降之前。 – Boneist 2015-03-19 14:33:55