как изменить тип поля в таблице?

  • Автор темы Sh00r00p
  • Дата начала
S

Sh00r00p

#1
подскажите пожалуйста, как изменить поле теблицы с возможным значением null на not null?
при записи
alter table EXPTARIF modify EXPTARIFPLAN_FR not null;
выдает ошибку
"ora- 02296: не могу разблокировать - найдены пустые значения
--Add/modify columns
alter table EXPTARIF modify EXPTARIFPLAN_FR not null"
 

Over

Well-known member
04.07.2007
116
0
#2
Всё правильно! Если у тебя в таблице есть записи, то в них обязательно должно быть задано значение этого поля. Иначе при изменении типа на NOT NULL система предполагает, что значение не должно быть пустым, а у тебя получается пустое, и поэтому возникает ошибка.
 
S

Sh00r00p

#3
что делать? как поменять тип поля? я вставил в таблицу поле но значения я туда не вводил...

почему-то косяк именно с этим полем! остальные поля которые я внес чуть позже меняются нормально.

еще одна штуковина которая вызвала у меня подозрение: это поле сначало не вставлялось и все поля которые начинались на EXPTARIFPLAN_* тоже, потом я взял и удалил эту таблицу с тестовой базы и создал новую с этим полем имеющим "not null" и попытался перекинуть все значения с боевой, но он мне выдал ошибку что поле не может быть not null т.к. есть какие-то значения хотя этого поля раньше не существовало. ну я и сделал поле с "null". теперь пытаюсь поменять с null на not null.
 
S

Sh00r00p

#4
так, я сделал... я все значения обнулил
update exptarif set EXPTARIFPLAN_post = 0;
а потом
alter table EXPTARIF modify EXPTARIFPLAN_FR not null;
теперь все работает.

но от чего у меня случилась эта штуковина я так и не понял!
 

Over

Well-known member
04.07.2007
116
0
#5
У тебя не работало, потому, что были записи, в которых это поле было пустое, без значения. А NOT NULL предполагает, что значение обязательно должно быть. Поэтому и не срабатывало. Тебе нужно было сначала заполнить какими-нибудь значениями все поля, у которых это значение было пустым.
 
S

Sh00r00p

#6
да, видать где-то касяк при заполнении с боевой базы был
 
O

Olala

#7
Согласно ограничению целостности NOT NULL, значение, хранящееся в базе данных не может быть неопределенным.
Проще всего использовать вдобавок к ограничению NOT NULL конструкцию DEFAULT <значение>:
Код:
alter table EXPTARIF modify EXPTARIFPLAN_FR default 0 not null;
Тогда не придется контролировать заполнение этого поля определенными значениями при редактировании таблицы.