2015-03-19 19 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