• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Sh00r00p

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

Over

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

Sh00r00p

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

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

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

Sh00r00p

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

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

Over

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

Sh00r00p

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

Olala

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!