它關於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代碼更新的。我需要做的是製作一個適用於這兩種情況的腳本 - 使用數據或在創建表格和修改列之後。
請修改您的問題以包含創建表(包括約束)腳本,以便我們至少可以複製您的特定場景。另外,你爲什麼要在PL/SQL中進行更新?這樣做會讓事情複雜化並放慢速度。相反,爲什麼不只是:'update table_name set new_column = old_column;',然後是顯式的'commit;'? – Boneist 2015-03-19 11:58:36
另外,「腳本不起作用」是什麼意思?它錯誤嗎?如果是這樣,你會得到什麼錯誤? – Boneist 2015-03-19 12:00:10
我認爲錯誤是'rec中的空格。 OLD_COLUMN';順便說一句。你應該像Boneist所做的那樣進行更新,不要忘記'commit' – 2015-03-19 12:04:26