将列从 INTEGER 更改为 BIGINT

Alter a Column from INTEGER To BIGINT

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

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

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

包含的数据是否以正确的方式转换?转换后此列是否为 "real" BIGINT 列?

我知道如果此列(Trigger、ForeingKey 等)有限制,这是不可能的。但是,如果没有约束,是否可以这样做呢?

还是通过Help-Column转换更好:

MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn

当你执行

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

Firebird 不会将现有数据从 INTEGER 转换为 BIGINT,而是会为 table.

创建新的格式版本

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

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

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

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