PostgreSQL | Как проверить существование записи в таблице? — efim360.ru

PostgreSQL | Как проверить существование записи в таблице?

Для проверки существования записи в таблице PostgreSQL нужно использовать связку команды SELECT и команды EXISTS.

SELECT EXISTS (SELECT * FROM a.t_dname WHERE dname = 'efim360');

В этом примере мы хотим получить ЛОГИЧЕСКОЕ ЗНАЧЕНИЕ -  TRUE или FALSE.

Если в таблице t_dname существует запись со значением 'efim360' в столбце dname, то нам вернётся true.

 

Использование в функции. Вставка если нет.

Такой способ очень помогает в написании функций с использованием условных конструкций IF THEN.

-- Вставка если нет

-- Проверка существования записи в таблице

-- Не повреждается автоинкремент первичного ключа

-- т. к. вставка осуществляется только при выполнении условия

 

CREATE OR REPLACE FUNCTION a.a4(str text)

RETURNS bigint

LANGUAGE 'plpgsql'

AS $$

    DECLARE pkey bigint;

    BEGIN

        IF NOT EXISTS (SELECT * FROM a.t_dname WHERE dname = str)

        THEN

            INSERT INTO a.t_dname (dname)

            VALUES (str)

            ON CONFLICT (dname)

            DO NOTHING

            RETURNING id INTO pkey;

            RETURN pkey;

        END IF;

        RETURN 0;

    END;

$$;

 

-- Получение всех данных из таблицы

SELECT * FROM a.t_dname;

 

SELECT * FROM a.t_dname WHERE dname = 'efim360'; -- есть в таблице

SELECT * FROM a.t_dname WHERE dname = '360'; -- нет в таблице

 

-- Проверка существования записи в таблице прямым запросом в среду

SELECT EXISTS(SELECT * FROM a.t_dname WHERE dname = 'efim360');

SELECT EXISTS(SELECT * FROM a.t_dname WHERE dname = '360');

SELECT NOT EXISTS(SELECT * FROM a.t_dname WHERE dname = 'efim360');

SELECT NOT EXISTS(SELECT * FROM a.t_dname WHERE dname = '360');

 

-- Вызов функции с параметром

SELECT a.a4('efim360');

SELECT a.a4('ef');

SELECT a.a4('ef2');

 

-- Удаление функции

DROP FUNCTION a.a4(str text);

 

Выражение (SELECT * FROM a.t_dname WHERE dname = str) при наличии возвращает true.

Выражение IF NOT EXISTS () меняет знак логического выражения на противоположный.

То есть, если совпадение записи найдено, значит добавлять эту запись не нужно и мы вываливаемся из условия и идём дальше по телу функции и в конечном итоге попадаем в RETURN 0;

Если совпадение НЕ найдено, то его нужно добавить. Тогда false заменится на true и мы попадём в THEN и в нём выполним вставку.

Такой способ помогает нам НЕ ПРОПУСКАТЬ автоинкрементные ключи в таблице. Номер идентификатора автоинкремента будет идти последовательно т. к. не будет ложных срабатываний команды INSERT из-за возможных ограничений на уровне таблицы (например уникальность значений столбца).

 

Информационные ссылки

pgAdmin 4 | Первичный ключ автоинкремент

PostgreSQL | Функция проверки наличия пробелов в строке данных или строке запроса с клиента

Официальный сайт PostgreSQL - https://www.postgresql.org

Команды SQL - https://postgrespro.ru/docs/postgresql/14/sql-commands

Команда CREATE FUNCTION - https://postgrespro.ru/docs/postgresql/14/sql-createfunction

Команда SELECT - https://postgrespro.ru/docs/postgresql/14/sql-select

Раздел "9.23. Выражения подзапросов" - https://postgrespro.ru/docs/postgresql/14/functions-subquery

Команда EXISTS - https://postgrespro.ru/docs/postgresql/14/functions-subquery#FUNCTIONS-SUBQUERY-EXISTS

Графический интерфейс pgAdmin - https://www.pgadmin.org