将列从 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。
在我的数据库中,我有几个 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。