SQL

پیدا کردن کلیدهای خارجیِ بدون ایندکس

PostgreSQL برای FKها خودکار ایندکس نمی‌سازه: بعدش هر DELETE روی جدول والد یه seq scan روی فرزند راه می‌ندازه. این کوئریِ کاتالوگ، FKهایی رو لیست می‌کنه که ستون اولشون تو هیچ ایندکسی نیست.

کاربرد

کندیِ غیرعادیِ DELETE روی والد، deadlock روی زنجیره‌های FKِ ایندکس‌نشده.

پیش‌نیازها

PostgreSQL (catalogues pg_constraint / pg_index)

SQL
SELECT
    c.conrelid::regclass        AS table_name,
    c.conname                   AS fk_name,
    string_agg(a.attname, ', ') AS fk_columns
FROM pg_constraint c
JOIN pg_attribute a
  ON a.attrelid = c.conrelid AND a.attnum = ANY (c.conkey)
WHERE c.contype = 'f'
  AND NOT EXISTS (
      SELECT 1
      FROM pg_index i
      WHERE i.indrelid = c.conrelid
        AND i.indkey[0] = c.conkey[1]   -- 1re colonne de l'index = 1re de la FK
  )
GROUP BY c.conrelid, c.conname
ORDER BY table_name;

نتیجه

 table_name  |          fk_name          | fk_columns
-------------+---------------------------+-------------
 order_items | order_items_order_id_fkey | order_id
 payments    | payments_invoice_id_fkey  | invoice_id
 shipments   | shipments_order_id_fkey   | order_id
(3 rows)   -- 3 FK sans index : DELETE parent = seq scan enfant
SQLForeign KeyIndexCatalogue

اسنیپت‌های مرتبط

بازگشت به آزمایشگاه داده