它关于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