gpt4 book ai didi

firebird - 将列从 INTEGER 更改为 BIGINT

转载 作者:行者123 更新时间:2023-12-05 09:18:55 25 4
gpt4 key购买 nike

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

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

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

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

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

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

MyIntegerColumn -> MyIntegerColumnBac -> MyBigIntColumn

最佳答案

当你执行

ALTER TABLE MyTable ALTER COLUMN MyIntegerColumn TYPE BIGINT;

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

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

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

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

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

关于firebird - 将列从 INTEGER 更改为 BIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42804860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com