将INTEGER中的列更改为BIGINT

时间:2017-03-15 08:46:48

标签: firebird firebird2.5 firebird-3.0

在我的数据库中,我有几个INTEGER类型的字段。我需要将其中一些更改为BIGINT。

所以我的问题是,我可以使用以下命令吗?

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

包含的数据是否以正确的方式转换?转换后这列是“真正的”BIGINT列吗?

我知道如果此列有限制(Trigger,ForeingKey,...),这是不可能的。但如果没有限制,可以这样做吗?

或者通过帮助栏转换它是否更好:

MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn

1 个答案:

答案 0 :(得分:7)

执行时

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

Firebird不会将现有数据从INTEGER转换为BIGINT,而是会为该表创建新的格式版本。

当插入新行或更新现有行时,该值将存储为BIGINT,但在阅读Firebird时,将转换旧版'从INTEGERBIGINT的动态行。作为用户,这对您来说是透明的。这是为了防止需要重写所有现有的行,这可能是昂贵的(IO,旧版本的行的垃圾收集等)。

所以请使用ALTER TABLE .. ALTER COLUMN,不要MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn。此规则有一些例外,例如(可能)有损字符集转换可以更好地完成,以防止select上的音译错误(如果新字符集中不存在字符)或更改(var)字符列要更短(不能用alter column完成)。

更具体一点:当在数据库中写入一行时,它包含该行的格式版本(也称为版本计数)。格式版本指向Firebird应该如何读取该行的行(数据类型等)的描述。 alter table将创建一个新的格式版本,并且在编写新行或更新现有行时将应用该格式。在读取旧行时,Firebird将应用必要的转换以将该行显示为新格式(例如,使用其默认值添加新列,转换列的数据类型)。

这些格式版本也是限制alter table数量的原因:如果在单个表上应用超过255个alter table,则must backup and restore the database(格式版本为单个字节),然后进一步更改允许那张桌子。