Как автоматически обнаружить и удалить дубликаты ограничений внешнего ключа в Postgresql - PullRequest
2 голосов
/ 11 февраля 2011

Моя база данных Postgresql имеет большое количество повторяющихся ограничений внешнего ключа для таблиц, например

"fkb43bb0b712b68565" FOREIGN KEY (owner_id) REFERENCES usr(id)
"fkb43bb0b71b63ed43" FOREIGN KEY (owner_id) REFERENCES usr(id)

Они делают то же самое, но имеют уникальные имена.

Как я могу автоматически обнаруживать и удалять такие дубликаты?

Спасибо

J

Ответы [ 3 ]

3 голосов
/ 14 сентября 2012
SELECT
    pc.conname as constraint_name, 
    --conrelid as child_table_id,   
    pclsc.relname as child_table,
    --pc.conkey as child_column_id,
    pac.attname as child_column,
    --confrelid as parent_table_id,
    pclsp.relname as parent_table,
    --pc.confkey as parent_column_id,
    pap.attname as parent_column,   
    nspname as schema_name
FROM 
    (
    SELECT
         connamespace,conname, unnest(conkey) as "conkey", unnest(confkey)
          as "confkey" , conrelid, confrelid, contype
     FROM
        pg_constraint
    ) pc
    JOIN pg_namespace pn ON pc.connamespace = pn.oid
    -- and pn.nspname = 'panmydesk4400'
    JOIN pg_class pclsc ON pc.conrelid = pclsc.oid
    JOIN pg_class pclsp ON      pc.confrelid = pclsp.oid
    JOIN pg_attribute pac ON pc.conkey = pac.attnum    and pac.attrelid =       pclsc.oid
    JOIN pg_attribute pap ON pc.confkey = pap.attnum and pap.attrelid = pclsp.oid

ORDER BY pclsc.relname

запрос выше вернет все ограничения внешнего ключа, которые вы просто удалите дублирующиеся записи.

Примечание: если вы удалите комментарии из запроса выше, вы можете просмотреть relID и ColID и запросдолжно работать для всех схем в базе данных

1 голос
/ 11 февраля 2011

Ограничения хранятся в pg_constraint , просто запросите это представление для поиска двойных ограничений.

0 голосов
/ 07 октября 2018
SELECT
    array_agg(pc.conname) as duplicated_constraints, 
    pclsc.relname as child_table,
    pac.attname as child_column,
    pclsp.relname as parent_table,
    pap.attname as parent_column,   
    nspname as schema_name
FROM 
    (
    SELECT
     connamespace,conname, unnest(conkey) as "conkey", unnest(confkey)
      as "confkey" , conrelid, confrelid, contype
     FROM
        pg_constraint
    ) pc
    JOIN pg_namespace pn ON pc.connamespace = pn.oid
    JOIN pg_class pclsc ON pc.conrelid = pclsc.oid
    JOIN pg_class pclsp ON pc.confrelid = pclsp.oid
    JOIN pg_attribute pac ON pc.conkey = pac.attnum and pac.attrelid = pclsc.oid
    JOIN pg_attribute pap ON pc.confkey = pap.attnum and pap.attrelid = pclsp.oid
GROUP BY child_table, child_column, parent_table, parent_column, schema_name HAVING COUNT(*)>1
ORDER BY child_table, child_column

перечислит только дублированные ограничения внешнего ключа в Postgresql

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