SQL: обновление реестров приводит к нарушению ограничений - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть такая таблица:

Table

Что я хочу сделать, это удалить первую букву в столбце имени пользователя, если это 'U'.

У меня есть проблема, если я сделаю:

UPDATE table
     SET USERNAME= SUBSTR(USERNAME, 2, LENGTH(USERNAME))
     WHERE USERNAME LIKE 'U%';

ORA-00001: уникальное ограничение (SPE.UQ_P_USUARIO_NOMBRE) нарушено.

Как вы можете видеть в Например, в таблице существует реестр 1111-A, и при изменении U1111-A появляется ошибка.

Я хочу создать запрос, который изменяет только те реестры, которых нет в таблице. делать?

Ответы [ 2 ]

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

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

UPDATE `table`
SET USERNAME= SUBSTR(USERNAME, 2, LENGTH(USERNAME))
WHERE USERNAME LIKE 'U%'
AND NOT EXISTS(SELECT 1 FROM `table` t WHERE t.USERNAME = SUBSTR(`table`.USERNAME, 2, LENGTH(`table`.USERNAME)) AND t.NAME = `table`.NAME);

Эта строка проверяет, есть ли строки с username - name пара, которую вы пытаетесь создать, уже существует, и если они это сделают, эта строка не обновляется

NOT EXISTS(SELECT 1 FROM `table` t WHERE t.USERNAME = SUBSTR(`table`.USERNAME, 2, LENGTH(`table`.USERNAME)) AND t.NAME = `table`.NAME)
0 голосов
/ 22 апреля 2020

Вы можете использовать ниже

    UPDATE table a
    SET USERNAME= SUBSTR(USERNAME, 2, LENGTH(USERNAME))
    WHERE USERNAME LIKE 'U%'
    AND NOT EXISTS (SELECT 1 FROM table b 
    where b.username=SUBSTR(a.USERNAME, 2, LENGTH(a.USERNAME)
    AND a.name=b.name)
...