将INTEGER中的列更改为BIGINT

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)

Mar*_*eel 7

当你执行

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;
Run Code Online (Sandbox Code Playgroud)

Firebird不会将现有数据转换INTEGERBIGINT,而是会为表创建新的格式版本.

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

所以请,请使用ALTER TABLE .. ALTER COLUMN,不要这样做MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn.此规则有一些例外情况,例如(可能)有损字符集转换可以更好地完成,以防止select在新字符集中不存在字符或将(var)char列更短时防止音译错误(这是无法做到的alter column).

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

这些格式版本也是限制alter table数量的原因:如果在单个表上应用超过255个alter table,则必须备份和还原数据库(格式版本为单个字节),然后才允许进一步更改那张桌子.