Комментарии 16
Дождались, наконец то, ON CONFLICT. Помню, что это была первая неожиданность при переходе c mysql.
Странная, конечно, конструкция «ON CONFLICT», лучше уж MERGE использовать, если хочется сделать и insert и update (имхо со стороны разработчика oracle)
Вот здесь один из разработчиков PostgreSQL рассказывает, почему UPSERT != MERGE.
Было бы круто увидеть в 9.5 полноценный multi-master replication (BDR).
С почином! Хорошая, обстоятельная статья.
Хорошо бы ещё добавить в конце ссылку на скачивание — только что вышла вторая альфа www.postgresql.org/about/news/1604
Хорошо бы ещё добавить в конце ссылку на скачивание — только что вышла вторая альфа www.postgresql.org/about/news/1604
Ну и судя по всему, полноценный релиз будет в 4-м квартале, а не 3-м.
Спасибо! Вчера, когда увидел информацию о второй альфе, добавил её в UPD в конец статьи, но статья почему-то не обновилась. Сейчас попробую еще раз.
Интересно, там где ON CONFLICT DO UPDATE, так же как в mysql будет увеличивать auto_increment (sequence) счётчик? Если да, то такая функциональность мало полезна.
А почему мало полезна?
PostgreSQL всегда увеличивает сначала счетчик (берет из него значение для записи предназначенной на вставку), а потом уже производит проверки и т.д. Так что если ваш INSERT упадет на CONSTRAINT или CHECK, то счетчик все равно будет увеличен.
Пример:
2
ERROR: duplicate key value violates unique constraint «country_name_key»
DETAIL: Key (name)=(USA) already exists.
3
PostgreSQL всегда увеличивает сначала счетчик (берет из него значение для записи предназначенной на вставку), а потом уже производит проверки и т.д. Так что если ваш INSERT упадет на CONSTRAINT или CHECK, то счетчик все равно будет увеличен.
Пример:
CREATE TABLE public.country
(
id bigserial,
name character varying,
UNIQUE (name)
);
INSERT INTO country (name)
VALUES ('USA'), ('Russia');
select currval('country_id_seq');
2
INSERT INTO country (name)
VALUES ('USA');
ERROR: duplicate key value violates unique constraint «country_name_key»
DETAIL: Key (name)=(USA) already exists.
select currval('country_id_seq');
3
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
PostgreSQL 9.5: что нового? Часть 1. INSERT… ON CONFLICT DO NOTHING/UPDATE и ROW LEVEL SECURITY