在我的数据库中,我有几个INTEGER类型的字段。我需要将其中一些更改为BIGINT。
所以我的问题是,我可以使用以下命令吗?
ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;
包含的数据是否以正确的方式转换?转换后这列是“真正的”BIGINT列吗?
我知道如果此列有限制(Trigger,ForeingKey,...),这是不可能的。但如果没有限制,可以这样做吗?
或者通过帮助栏转换它是否更好:
MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn
答案 0 :(得分:7)
执行时
ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;
Firebird不会将现有数据从INTEGER
转换为BIGINT
,而是会为该表创建新的格式版本。
当插入新行或更新现有行时,该值将存储为BIGINT
,但在阅读Firebird时,将转换旧版'从INTEGER
到BIGINT
的动态行。作为用户,这对您来说是透明的。这是为了防止需要重写所有现有的行,这可能是昂贵的(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(格式版本为单个字节),然后进一步更改允许那张桌子。