2016-07-01 2 views
3

Я пытаюсь добавить столбец в таблицу firebird. Столбец должен иметь значение по умолчанию 1, но первоначально для уже существующих строк значение должно быть установлено равным 0. И это должно произойти в одной транзакции.Firebird добавить столбец со значением по умолчанию, но другое значение

Я попытался

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.

Другие варианты, чтобы получить то, что я хочу в одной транзакции?

ответ

3

К сожалению, вы не можете сделать это за одну транзакцию. Firebird не разрешает обновлениям/вставкам использовать объекты, созданные в одной и той же транзакции (в этом случае столбец), потому что DDL на самом деле действительно выполняется или завершается только при фиксации транзакции и по той же причине выполняет два оператора alter table для того же столбца будет вести себя так, как будто был выдан только один оператор 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.

Смежные вопросы