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

Sql Firebird添加具有默认值但值不同的列,sql,firebird,ddl,firebird2.5,Sql,Firebird,Ddl,Firebird2.5,我正在尝试向firebird表添加列。该列应具有默认值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 N

我正在尝试向firebird表添加列。该列应具有默认值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不允许更新/插入使用在同一事务中创建的对象(在本例中为列),因为DDL实际上只在事务提交时执行/完成,出于同样的原因,为同一列执行两个
altertable
语句的行为将如同只发出一个
altertable
语句一样(因此将应用最后一个默认值)

您有两个选择:

  • 添加初始默认值为0的列,提交,更改新默认值为1的列
  • 添加最终默认值为1的列,提交,更新初始值为0的列
  • 实际上还有更多的选择,但这只会使事情复杂化(特别是在Firebird 3之前),并且需要更多的事务

    顺便说一句:
    ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL
    应该给您一个语法错误,因为在Firebird 2.5中不支持更改
    NOT NULL
    ,而在Firebird 3中则需要