, если слово присутствует в таблице, и мы хотим вставить одно и то же слово с другим регистром, тогда должно появиться сообщение об ошибке, что мы не можем вставить эти данные
Вы можете использовать уникальный Индекс на основе функций для достижения этого.
На данный момент у вас есть уникальное ограничение, чувствительное к регистру, например:
create table your_table (name varchar2(30));
alter table your_table add constraint con_unique_name unique (name);
insert into your_table (name) values ('ABC');
insert into your_table (name) values ('XYZ');
commit;
, которое блокирует точную копию, но допускает изменения в регистре для вставки:
insert into your_table (name) values ('ABC');
ORA-00001: unique constraint (STACK.CON_UNIQUE_NAME) violated
insert into your_table (name) values ('Abc');
1 row inserted.
insert into your_table (name) values ('abc');
1 row inserted.
rollback;
Если вы добавляете уникальный индекс, который использует версию значения в верхнем регистре (или в нижнем регистре; не имеет значения, если это согласованно!), а также, или вместо существующих ограничений, тогда они будут также заблокированы:
create unique index idx_unique_name on your_table (upper(name));
insert into your_table (name) values ('ABC');
ORA-00001: unique constraint (STACK.CON_UNIQUE_NAME) violated
insert into your_table (name) values ('Abc');
ORA-00001: unique constraint (STACK.IDX_UNIQUE_NAME) violated
insert into your_table (name) values ('abc');
ORA-00001: unique constraint (STACK.IDX_UNIQUE_NAME) violated
Обратите внимание, что сообщаемое имя ограничения отличается для первого - оно все еще поражает исходное уникальное ограничение, в то время как в смешанном регистре передают это ограничение и затем терпят неудачу на новом индексе. Если вы отбросите исходное ограничение, то все они потерпят неудачу в новом индексе.