mno*_*tka 11 oracle database-design migration alter-table
假设我有两列类型NUMBER(没有精度和比例)和VARCHAR(300). 我看到这些列对于我的数据来说太大了,所以我想将它们修改为NUMBER(11)和VARCHAR(10)。所以如果我运行这个 SQL 语句:
ALTER TABLE FOO
MODIFY(BAR NUMBER(10));
Run Code Online (Sandbox Code Playgroud)
NUMBER(10),oracle 会告诉我吗?有没有官方文档回答我的问题?
Lei*_*fel 13
在甲骨文管理员指南说的情况如下:
使用 ALTER TABLE...MODIFY 语句修改现有的列定义。您可以修改列数据类型、默认值、列约束、列表达式(对于虚拟列)和列加密。
如果所有现有数据都满足新长度,您可以增加或减少现有列的长度。您可以将列从字节语义更改为 CHAR 语义,反之亦然。您必须设置初始化参数 BLANK_TRIMMING=TRUE 以减少非空 CHAR 列的长度。
如果您正在修改表以增加数据类型为 CHAR 的列的长度,请意识到这可能是一项耗时的操作,并且可能需要大量额外存储,尤其是在表包含许多行的情况下。这是因为每行中的 CHAR 值必须填充空白以满足新的列长度。
在甲骨文SQL语言参考具有更多的细节包括以下内容:
如果列的所有行都包含空值,则您可以更改任何列的数据类型。但是,如果更改物化视图容器表中列的数据类型,则 Oracle 数据库会使相应的物化视图无效。
无论所有行是否包含空值,您始终可以增加字符或原始列的大小或数字列的精度。只要更改不需要修改数据,您就可以减小列的数据类型的大小。如果存在超过新长度限制的数据,数据库将扫描现有数据并返回错误。
您可以将 DATE 列修改为 TIMESTAMP 或 TIMESTAMP WITH LOCAL TIME ZONE。您可以将任何 TIMESTAMP WITH LOCAL TIME ZONE 修改为 DATE 列。
如果表为空,则您可以增加或减少日期时间或间隔列的前导字段或小数秒值。如果表不为空,则只能增加日期时间或间隔列的前导字段或小数秒。
对于 CHAR 和 VARCHAR2 列,您可以通过指定 CHAR(指示最初以字节指定的列的字符语义)或 BYTE(指示最初以字符指定的列的字节语义)来更改长度语义。要了解现有列的长度语义,请查询 ALL_、USER_ 或 DBA_TAB_COLUMNS 数据字典视图的 CHAR_USED 列。
上述文档中有其他信息和限制。这是尝试降低 Number 列的精度并减少 Varchar2 长度的演示。您可以尝试其他更改,以便了解会发生什么。
--Setup.
DROP TABLE FOO;
CREATE TABLE FOO (BAR Number, BAR2 VARCHAR2(300));
INSERT INTO FOO (SELECT Level, RPAD(to_char(Level),10*Level,to_char(Level))
FROM DUAL CONNECT BY Level <=20);
COMMIT;
SELECT * FROM FOO;
--Reduce Number to Number(10).
ALTER TABLE FOO MODIFY (BAR NUMBER (10));
--Reduce Varchar2(300) to Varchar2(100) (data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100));
--Reduce Varchar2(300) to Varchar2(200) (no data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(200));
Run Code Online (Sandbox Code Playgroud)
alter 语句具有以下输出:
ALTER TABLE FOO MODIFY (BAR NUMBER (10))
Error report:
SQL Error: ORA-01440: column to be modified must be empty to decrease precision or scale
01440. 00000 - "column to be modified must be empty to decrease precision or scale"
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100))
Error report:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
01441. 00000 - "cannot decrease column length because some value is too big"
table FOO altered.
Run Code Online (Sandbox Code Playgroud)
通过创建新列来降低精度。
ALTER TABLE FOO ADD (BAR3 NUMBER(10));
UPDATE FOO SET Bar3 = Bar;
ALTER TABLE FOO DROP COLUMN BAR;
ALTER TABLE FOO RENAME COLUMN BAR3 TO BAR;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60997 次 |
| 最近记录: |