Ral*_*alf 5 sql ddl firebird firebird2.5
我正在尝试向 firebird 表添加一列。该列应该有一个默认值 1,但最初对于已经存在的行,该值应该设置为 0。这应该发生在一个事务中。
我试过
ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 1 NOT NULL;
UPDATE MYTABLE SET MYCOLUMN = 0;
Run Code Online (Sandbox Code Playgroud)
但这在一笔交易中是不允许的,因为更新不会看到新列。我也试过:
ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 0 NOT NULL;
ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL;
Run Code Online (Sandbox Code Playgroud)
希望该列之后为 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 中它需要一个单独的alter table mytable alter column set not null.