переписать запрос UPDATE ORDER BY из MySQL в PostgreSQL

286
18 октября 2021, 09:00

Есть уникальный составной индекс на два поля - (gsort, isort).

В Mysql у меня есть запрос, где update проходил с конца выборки, чтобы избежать ошибки об уникальности уникального индекса. Как мне такое реализовать на PostgreSQL? Спасибо

    UPDATE table
    SET isort = isort + 1
    WHERE isort > :isort
        AND gsort = :gsort
    ORDER BY isort DESC;
Answer 1

чтобы избежать ошибки об уникальности уникального индекса

Давайте собственно эту основную задачу и решать. PostgreSQL позволяет уникальной ограничение сделать отложенным.

ALTER TABLE table
ADD constraint table_gsort_isort_unique unique (gsort, isort) deferrable initially deferred;

Такое ограничение проверяется не в момент записи в таблицу, а при фиксации транзакции. Таким образом:

melkij=> create temp table tablename (i serial primary key, gsort int, isort int);
CREATE TABLE
melkij=> ALTER TABLE tablename
    ADD constraint table_gsort_isort_unique unique (gsort, isort) deferrable initially deferred;
ALTER TABLE
melkij=> insert into tablename (gsort, isort) values (1,1);
INSERT 0 1
melkij=> insert into tablename (gsort, isort) values (1,1);
INSERT 0 1
melkij=> select * from tablename;
 i | gsort | isort 
---+-------+-------
 1 |     1 |     1
 2 |     1 |     1
melkij=>commit;
ERROR:  duplicate key value violates unique constraint "table_gsort_isort_unique"

Таблица внутри транзакции может временно нарушать ограничения уникальности. И вы можете что угодно при этом делать, база вам не позволит только зафиксировать невалидное состояние таблицы. Если на момент commit у вас условие уникальности не будет нарушаться - то проблемы нет, транзакция будет зафисирована.

READ ALSO
BrowserSync не видит стили (локально всё отображается)

BrowserSync не видит стили (локально всё отображается)

Настроила BrowserSync, стили на нём подгружаются лишь при нахождении html-файла в папке над cssПри размещении в соседнюю папку - отключаются (локально...

121
Аналог webkit-fill-available для Firefox

Аналог webkit-fill-available для Firefox

Мне нужно чтобы блок Child Div был по высоте как Parent DIV, но не превышал егоДля этого я прописал:

92
Как стилизовать input [type='submit']? С помощью JS или CSS

Как стилизовать input [type='submit']? С помощью JS или CSS

Подскажите пожалуйста, каким образом можно из input[type=submit] сделать кнопку вот как эта?

164
Приклеить div к низу экрана

Приклеить div к низу экрана

Есть div с результатом подсчета калькулятора (#grid-15-15)Нужно этот div "приклеить" к низу экрана, чтобы он оставался там и прокручивался вместе со страницей,...

204