Добавить столбец NOT NULL LOB без значения по умолчанию в Oracle - PullRequest
0 голосов
/ 16 сентября 2011

Я пытаюсь добавить столбец CLOB в таблицу (фактически измените VARCHAR на CLOB, но это только кажется возможным, добавив новый столбец, скопировав и отбросив старый).Столбец должен быть NOT NULL без значения по умолчанию (и таблица не пуста).Как мне этого добиться?

Моя первоначальная идея состояла в том, чтобы создать столбец с фиктивным значением по умолчанию и изменить его позже, но это не представляется возможным:

ALTER TABLE foo RENAME COLUMN text TO text_temp;
ALTER TABLE foo ADD (
    text CLOB DEFAULT '*' NOT NULL
);
UPDATE foo SET text = text_temp;
ALTER TABLE foo DROP COLUMN text_temp;
ALTER TABLE foo MODIFY (
    text CLOB NOT NULL
);
-- ORA-22296: invalid ALTER TABLE option for conversion of LONG datatype to LOB

Я также попытался определитьстолбец как text CLOB и добавление ограничения NOT NULL позже, но оно выдает ту же ошибку.Есть ли способ сделать это, кроме воссоздания всей таблицы?

Ответы [ 2 ]

10 голосов
/ 16 сентября 2011

ли

ALTER TABLE foo MODIFY text DEFAULT NULL;

работаешь на тебя?

При добавлении или удалении значения по умолчанию или ограничения NOT NULL вам не нужно указывать тип данных столбца.

РЕДАКТИРОВАТЬ : Цитировать документацию Oracle по ALTER TABLE:

Если столбец имеет значение по умолчанию, вы можете использовать предложение DEFAULT, чтобы изменить значение по умолчанию на NULL, но вы не можете полностью удалить значение по умолчанию. Если столбцу когда-либо было присвоено значение по умолчанию, то в столбце DATA_DEFAULT представления словаря данных USER_TAB_COLUMNS всегда будет отображаться либо значение по умолчанию, либо NULL.

Это должно объяснить, почему вы видите разницу в SQL Developer.

Однако я не думаю, что есть существенная разница между указанием DEFAULT NULL для столбца и не указанием значения по умолчанию. В обоих случаях нулевое значение будет приниматься для любого столбца, которому явно не дано значение в операторе INSERT.

3 голосов
/ 16 сентября 2011

Вы объявляете столбец как NOT NULL, когда добавляете его в таблицу, поэтому вам не нужно делать его снова NOT NULL.Я думаю, что если вы исправите синтаксис в последнем предложении MODIFY, вы все равно получите ошибку, хотя и другую (точное число ускользает от меня прямо сейчас).

Но то, что вы пытаетесь достичь, определенно возможно, справильный синтаксис:)

SQL> alter table t23 add ctxt clob
  2  /

Table altered.

SQL> update t23 set ctxt = txt
  2  /

2 rows updated.

SQL> alter table t23 modify ctxt not null
  2  /

Table altered.

SQL> alter table t23 drop column txt
  2  /

Table altered.

SQL> alter table t23 rename column ctxt to txt
  2  /

Table altered.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...