В общем, вышеприведенный констрейнт не работал с переносами строк ни в каком виде, переделал сначала в check(barcode=to_number(barcode)), но падало с непонятной юзеру ошибкой, сделал по другому
создаем новое ограничение без проверки
Код:
alter table supermag.smstoreunits add constraint okbarcode_digit check(length(replace(TRANSLATE(barcode, '0123456789','0'),'0'))=0) novalidate;
удаляем старое ограничение
Код:
alter table supermag.smstoreunits drop constraint okcheck_digit;
смотрим, какие кривые данные уже попали
Код:
select '('||barcode||')' from supermag.smstoreunits where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null;
удаляем те записи, которые уже поправили вручную (убрали перенос строки)
Код:
delete from supermag.smstoreunits where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null and replace(barcode,chr(10),'') in (select barcode from supermag.smstoreunits);
убираем перенос строки (наиболее частая ошибка)
Код:
update supermag.smstoreunits set barcode=replace(barcode,chr(10),'') where length(replace(TRANSLATE(barcode, '0123456789','0'),'0')) is not null;
включаем ограничение с проверкой
Код:
alter table supermag.smstoreunits enable validate constraint okbarcode_digit;