Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / это норма или не норма? insert с проверкой на уникальность / 5 сообщений из 5, страница 1 из 1
18.12.2015, 01:06
    #39131434
это норма или не норма? insert с проверкой на уникальность
Добрый вечер!
прошелся поиском по форуму посмотрел темы связанные с игнорированием дубликатов по UK/PK при вставке, но тема показалась не раскрытой.

У меня такой кейс. Допустим есть таблица:
Код: sql
1.
2.
3.
4.
create table test (
 id integer,
 primary key(id)
);



Выполняем запрос
Код: sql
1.
2.
3.
4.
insert into test (id)
	select a.id from (
	select 1 id) a
where not exists (select * from test where id = a.id)



Запрос вставил одну запись. Коммит не делаю, выполняю запрос еще раз. Вставил уже ноль записей.
Работает ожидаемо - ОК.
Делаю откат транзакции - ОК. Запись из таблицы исчезла.

Выполняю чуть модифицированный запрос вставки:
Код: sql
1.
2.
3.
4.
5.
6.
insert into test (id)
	select a.id from (
        select 1 id
        union all
	select 1 id) a
where not exists (select * from test where id = a.id)



и балалайка. Получаю ошибку нарушения уникальности.
Как это понимать? Направьте плиз, тут какие то принципиальные ограничения?

Спасибо
...
Рейтинг: 0 / 0
18.12.2015, 03:32
    #39131464
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
это норма или не норма? insert с проверкой на уникальность
Поролоновый слон тут какие то принципиальные ограничения?
не ограничения, а здравый смысл. селект формирует две строки в соответствии с отсутствием строк в таблицы на начало выполеения. понавыдумывать порядков выполнения декларативного языка можно множество, но в базах данных главное стабильность результтата.
...
Рейтинг: 0 / 0
18.12.2015, 09:29
    #39131540
grufos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
это норма или не норма? insert с проверкой на уникальность
Поролоновый слон,

в 9.5 уже встроили конструкцию в INSERT для работы с конфликтами
http://www.postgresql.org/docs/9.5/static/sql-insert.html

ON-CONFLICT
...
Рейтинг: 0 / 0
18.12.2015, 12:47
    #39131732
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
это норма или не норма? insert с проверкой на уникальность
Поролоновый слон,

это норма. почитайте про последовательность выполнения запросов, и тогда, думаю, станет понятно. если коротко, то INSERT будет добавлять не построчно (каждую запись отдельно) а целиком то что получил из SELECT'а, а во время SELECT такое значение как 1 в таблице отсутсвовало. так что - норма.
...
Рейтинг: 0 / 0
18.12.2015, 13:46
    #39131812
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
это норма или не норма? insert с проверкой на уникальность
Пардон, а какое поведение ожидалось??
Что вставит одну запись а вторую нет?
А тогда сколько в выражении
Код: sql
1.
where not exists (select * from test where id = a.id)


раз должен был выполнятся подзапрос???? 2 чтоли???
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / это норма или не норма? insert с проверкой на уникальность / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]