我正在尝试将列添加到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.
在一次交易中获得我想要的更多选项?
答案 0 :(得分:3)
很遗憾,您无法在单笔交易中执行此操作。 Firebird不允许更新/插入使用在同一事务中创建的对象(在本例中为列),因为DDL实际上只是在事务提交时才真正执行/完成,并且出于同样的原因执行两个{{1}同一列的语句的行为就好像只发出了一个0dp
语句(因此将应用最后一个默认值)。
您有两种选择:
实际上还有一些选项,但这只会使问题复杂化(特别是在Firebird 3之前),并且需要更多的交易。
顺便说一句:alter table
应该给你一个语法错误,因为在Firebird 2.5中不支持更改alter table
,而在Firebird 3中它需要a separate alter table mytable alter column set not null
。