Firebird 添加具有默认值但不同值的列

Firebird add column with default value but different value

我正在尝试向 firebird 添加一列 table。该列应具有默认值 1,但最初对于已存在的行,该值应设置为 0。这应该在一个事务中发生。

我试过了

ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 1 NOT NULL;
UPDATE MYTABLE SET MYCOLUMN = 0; 

但在一个事务中不允许这样做,因为更新将看不到新列。我也试过:

ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 0 NOT NULL;
ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL;

希望该列之后为 0 但实际为 1。

更多选项,一次交易就能得到我想要的东西?

很遗憾,您不能在单笔交易中执行此操作。 Firebird 不允许 updates/inserts 使用在同一事务中创建的对象(在本例中为列),因为 DDL 实际上仅在事务提交时才真正 executed/completed,并且出于同样的原因执行两个 [=同一列的 10=] 个语句将表现得好像只发出了一个 alter table 语句(因此将应用最后一个默认值)。

你有两个选择:

  1. 添加初始默认值为 0 的列,提交,更改新默认值为 1 的列,
  2. 添加最终默认值为1的列,提交,更新初始值为0的列。

实际上还有更多选择,但这只会使事情复杂化(尤其是在 Firebird 3 之前),并且需要更多交易。

顺便说一句:ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL 应该给你一个语法错误,因为在 Firebird 2.5 中不支持更改 NOT NULL,而在 Firebird 3 中它需要 a separate alter table mytable alter column set not null.