我正在尝试向 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 实际上仅在事务提交时才真正执行/完成,并且出于同样的原因执行两个 alter table
同一列的语句将表现为只有一个 alter table
语句已发出(因此将应用最后一个默认值)。
您有两个选择:
实际上还有更多选择,但这只会使问题复杂化(尤其是在 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
.
关于sql - Firebird 添加具有默认值但不同值的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38148247/