Отбросьте ограничение, сохраняя имя переменной со специальными символами в Postgresql - PullRequest
0 голосов
/ 22 октября 2018

Я хочу удалить ограничение с неизвестным именем, поэтому я использую следующий код:

EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';

Проблема в том, что fk_Name заканчивается на '~', поэтому я получаю синтаксическую ошибку.

Полный код:

DO $$
DECLARE fk_Name TEXT;
BEGIN
    fk_Name := (SELECT
                tc.constraint_name
                FROM
                information_schema.table_constraints AS tc
                JOIN information_schema.key_column_usage AS kcu
                ON tc.constraint_name = kcu.constraint_name
                AND tc.table_schema = kcu.table_schema
                JOIN information_schema.constraint_column_usage AS ccu
                ON ccu.constraint_name = tc.constraint_name
                AND ccu.table_schema = tc.table_schema
                WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
    IF fk_Name IS NOT NULL THEN
        EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT '||fk_Name||';';
    END IF;
END $$;

1 Ответ

0 голосов
/ 22 октября 2018

это должно решить вашу проблему:

DO $$
DECLARE fk_Name TEXT;
BEGIN
    fk_Name := (SELECT
                tc.constraint_name
                FROM
                information_schema.table_constraints AS tc
                JOIN information_schema.key_column_usage AS kcu
                ON tc.constraint_name = kcu.constraint_name
                AND tc.table_schema = kcu.table_schema
                JOIN information_schema.constraint_column_usage AS ccu
                ON ccu.constraint_name = tc.constraint_name
                AND ccu.table_schema = tc.table_schema
                WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='IntravenousTherapyAppointment' AND ccu.table_name='MedicamentMeasurementUnit');
    IF fk_Name IS NOT NULL THEN
        EXECUTE 'ALTER TABLE public."IntravenousTherapyAppointment" DROP CONSTRAINT "'||fk_Name||'";';
    END IF;
END $$;

PS: будьте осторожны при обработке объектов / ограничений, имеющих двойные кавычки.

...