Как вставить другое значение в Oracle - PullRequest
0 голосов
/ 22 января 2020

Предположим, у меня есть столбец с именем UNIQUE Constraint на нем, и в нем есть данные AB C, XYZ et c. И я хочу вставить дополнительные данные. Если данные отличаются, вставьте их. И возьмите AB C так же, как Ab c, ab c, ab C et c.

Ответы [ 2 ]

3 голосов
/ 22 января 2020

, если слово присутствует в таблице, и мы хотим вставить одно и то же слово с другим регистром, тогда должно появиться сообщение об ошибке, что мы не можем вставить эти данные

Вы можете использовать уникальный Индекс на основе функций для достижения этого.

На данный момент у вас есть уникальное ограничение, чувствительное к регистру, например:

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

Обратите внимание, что сообщаемое имя ограничения отличается для первого - оно все еще поражает исходное уникальное ограничение, в то время как в смешанном регистре передают это ограничение и затем терпят неудачу на новом индексе. Если вы отбросите исходное ограничение, то все они потерпят неудачу в новом индексе.

0 голосов
/ 22 января 2020

Вы можете сделать вставку, например,

insert into yourtable(name)
select 'ABC'
from yourtable
group by ''
having count(*) > 0
where not exists (select 1 from yourtable yt where yt.name = yourtable.name);

(не проверено)

, или вы можете заключить if в insert, чтобы увидеть, существует ли это имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...