Удалить строку с определенным номером строки в Postgres - PullRequest
3 голосов
/ 15 июля 2009

Я создаю приложение, в котором мне нужно удалить строку таблицы с определенным номером строки. Я не хочу использовать или полагаться на идентификатор, потому что если я удаляю строку, следующие строки не будут «сдвигаться вниз» - строка 8 сегодня может быть строкой 7 завтра, но строка 8 все равно будет иметь идентификатор 8.

Как мне написать Postgres SQL, который по сути делает это:

DELETE FROM Table
WHERE <row_number> = n;

И row_number не является настоящим атрибутом.

Ответы [ 4 ]

1 голос
/ 15 июля 2009

Ваш вопрос довольно плохо определен; Как прокомментирует Милен, что вы на самом деле подразумеваете под "строкой" и "номером строки"? Я надеюсь, что у вас есть ORDER BY во всех ваших запросах, если вы делаете такие вещи. Этот вопрос также становится тривиальным, если в ваших строках есть первичные ключи ... а у вас нет? Таблица без первичных ключей - это таблица, которая вызывает проблемы и обычно указывает на серьезный конструктивный недостаток.

В любом случае, если вы хотите идти вперед на полной скорости, черт побери о потенциальных проблемах в пути, функции управления окнами в 8.4 , вероятно, сделают то, что вам нужно, с минимальными усилиями. Или вы могли бы сэкономить кучу хлопот завтра , написав лучшую схему сегодня .

0 голосов
/ 24 июня 2011

Не совсем номер строки таблицы как таковой, но должен выполнять желаемую работу. Возможно, немного более гибким, потому что вы можете сделать заказ по дате и времени или любой другой порядок, который вам нравится. Я собираюсь использовать это для недавнего списка.

DELETE 
FROM table 
WHERE pk IN 
    (
        SELECT pk 
        FROM  table 
        ORDER BY pk OFFSET n
    )
0 голосов
/ 15 июля 2009

То, что вы хотите, это, вероятно, OID:

DELETE FROM Table WHERE oid = n;

См. здесь для более подробной информации

0 голосов
/ 15 июля 2009

Я бы пошел на:

DELETE FROM Table OFFSET <row_number> limit 1 order by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...