And*_*eas 1 firebird firebird2.5 firebird-3.0
在我的数据库中,我有几个INTEGER类型的字段.我需要将其中一些更改为BIGINT.
所以我的问题是,我可以使用以下命令吗?
ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;
Run Code Online (Sandbox Code Playgroud)
包含的数据是否以正确的方式转换?转换后这列是"真正的"BIGINT列吗?
我知道如果此列有限制(Trigger,ForeingKey,...),这是不可能的.但如果没有限制,可以这样做吗?
或者通过帮助列转换它更好:
MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn
Run Code Online (Sandbox Code Playgroud)
当你执行
ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;
Run Code Online (Sandbox Code Playgroud)
Firebird不会将现有数据转换INTEGER为BIGINT,而是会为表创建新的格式版本.
插入新行或更新现有行时,该值将存储为a BIGINT,但在读取Firebird时会将"旧"行转换INTEGER为BIGINT.作为用户,这对您来说是透明的.这是为了防止需要重写所有现有的行,这可能是昂贵的(IO,旧版本的行的垃圾收集等).
所以请,请使用ALTER TABLE .. ALTER COLUMN,不要这样做MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn.此规则有一些例外情况,例如(可能)有损字符集转换可以更好地完成,以防止select在新字符集中不存在字符或将(var)char列更短时防止音译错误(这是无法做到的alter column).
更具体一点:当在数据库中写入一行时,它包含该行的格式版本(也称为版本计数).格式版本指向Firebird应该如何读取该行的行(数据类型等)的描述.alter table将创建一个新的格式版本,并且在编写新行或更新现有行时将应用该格式.在读取旧行时,Firebird将应用必要的转换以将该行显示为新格式(例如,使用其默认值添加新列,转换列的数据类型).
这些格式版本也是限制alter table数量的原因:如果在单个表上应用超过255个alter table,则必须备份和还原数据库(格式版本为单个字节),然后才允许进一步更改那张桌子.
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |