ОБНОВЛЕНИЕ ... LIMIT 1 PostgreSQL без ПК - PullRequest
0 голосов
/ 27 августа 2018

Не могли бы вы помочь мне создать SQL-запрос для PostgreSQL для обновления первой записи в таблице без первичного ключа? Что-то вроде

UPDATE "company"
SET "salary" = 6
WHERE "name" = 'x' AND "age" = 5 AND "address" = 'x' AND "salary" = 5
LIMIT 1;  

* Обратите внимание, что в таблице нет PK. Это означает, что может быть абсолютно одинаковая запись с одинаковыми значениями

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Каждая строка в таблице имеет системный столбец ctid типа tid, который представляет физическое местоположение строки:, поэтому вы можете обновить с помощью ctid

UPDATE company
    SET salary = 6
    WHERE ctid =(0,1)
0 голосов
/ 27 августа 2018

Вы можете обновить ровно одну строку, используя ctid. Таблицы SQL неупорядочены , поэтому «первой» строки не существует, но вы можете ограничить обновление одной строкой:

UPDATE "company" c
    SET "salary" = 6
    WHERE "name" = 'x' AND "age" = 5 AND "address" = 'x' AND "salary" = 5 AND
          ctid = (SELECT ctid
                  FROM "company" c2
                  WHERE c2."name" = c."name" and c2."age" = c."age" and c2."address" = c."address" and c2."salary" = c."salary"
                  ORDER BY ctid
                  LIMIT 1
                 );

Тем не менее, я думаю, что вы должны приложить усилия для исправления таблицы, а не пытаться работать с данными, которые только будут вызывать проблемы.

0 голосов
/ 27 августа 2018

Краткий ответ: Вы не можете. Если предложение «WHERE» не может ограничить выбор одной строкой, вы действительно не сможете делать то, что хотите.

Есть ли в строках внутренний идентификатор строки, с которым справляется сама база данных? Если это так, вы можете использовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...