关于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 :(得分:0)
以下脚本适用于我,无论insert语句是否存在(即表中是否包含数据):
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列中存在任何重复值,您将无法重新创建它。
答案 1 :(得分:0)
作为替代方案,您可以保存旧数据并使用新参数创建新表。然后插入旧值。
在SQL Server Management Studio中:
“您的数据库” =>任务=> generatescripts =>选择特定的数据库对象=>“您的表” =>高级=>要编写脚本的数据类型-模式和数据=>生成