• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

  • Автор темы Автор темы 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"
 
Всё правильно! Если у тебя в таблице есть записи, то в них обязательно должно быть задано значение этого поля. Иначе при изменении типа на NOT NULL система предполагает, что значение не должно быть пустым, а у тебя получается пустое, и поэтому возникает ошибка.
 
что делать? как поменять тип поля? я вставил в таблицу поле но значения я туда не вводил...

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

еще одна штуковина которая вызвала у меня подозрение: это поле сначало не вставлялось и все поля которые начинались на EXPTARIFPLAN_* тоже, потом я взял и удалил эту таблицу с тестовой базы и создал новую с этим полем имеющим "not null" и попытался перекинуть все значения с боевой, но он мне выдал ошибку что поле не может быть not null т.к. есть какие-то значения хотя этого поля раньше не существовало. ну я и сделал поле с "null". теперь пытаюсь поменять с null на not null.
 
так, я сделал... я все значения обнулил
update exptarif set EXPTARIFPLAN_post = 0;
а потом
alter table EXPTARIF modify EXPTARIFPLAN_FR not null;
теперь все работает.

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab