具有或不具有表中数据的更改列的长度

问题描述 投票:0回答:2

关于ORACLE(PL / SQL)脚本。老实说,我对databse不太熟悉。我想将一列中的字符串长度从30更改为60。这不是null列。如果表为空,并且我运行以下脚本,那么它将起作用:

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代码更新的。我需要做的是制作一个在两种情况下都可以使用的脚本-使用数据或在创建表和修改列之后。

database oracle sql-scripts
2个回答
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
投票

或者,您可以保存旧数据并使用新参数创建新表。然后插入旧值。

© www.soinside.com 2019 - 2024. All rights reserved.