在 table 中更改包含或不包含数据的列长度

Alter column length with or without data in table

它是关于 ORACLE (PL/SQL) 脚本的。老实说,我对数据库不是很熟悉。 我想将列中字符串的长度从 30 更改为 60。它不是空列。 如果 table 是空的并且我 运行 下面的脚本那么它工作:

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);
/

但是,如果 table 有值,则此脚本不起作用。 它给出错误:无法删除约束 - 不存在的约束

但是,如果我删除有关约束的行(倒数第二行和倒数第二行),它就会起作用。 现在我不知道 table 是空的还是有数据,所以我需要一个可以在这两种情况下工作的脚本。有人可以帮忙吗?

以下用于创建 table 的脚本:

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)
)
/

因此,在创建 table 时,它设置了主键约束,但在更新 table 时,它以某种方式删除了这个约束。我只是简单地解释一下这里的情况。 table 是通过 java 代码进行的更新。我需要做的是制作一个在两种情况下都适用的脚本 - 使用数据或在创建 table 并修改列之后。

无论插入语句是否存在(即 table 有或没有数据),以下脚本对我都有效:

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 列中存在任何重复值,您将无法重新创建它。

作为替代方案,您可以保存旧数据并使用新参数创建新的 table。然后插入旧值。

在 SQL Server Management Studio 中:

"your database" => 任务 => 生成脚本 => select 特定数据库对象 => "your table" => 高级 => 脚本数据类型 - 模式和数据 => 生成