Tüm tablolar için birincil anahtarları listeleme - Postgresql


14

Bunu yapacak bir sorgu var mı?

Bir tablo için bunu yapabileceğiniz bazı sorgular buldum, ancak görebildiğim için değiştiremedim:

tablename | column | type

1
Bunu sorsaydım, bir sütunun PK'deki sıradaki konumunu bilmek isterdim (bazı PK'ların 1'den fazla sütunu vardır ve sıra önemli olabilir).
— ypercubeᵀᴹ

Yanıtlar:


13

Bunun gibi bir şey:

select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
  join information_schema.key_column_usage kc 
    on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
  and kc.ordinal_position is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

Bu sorgu yalnızca birincil anahtarları değil, aynı zamanda benzersiz dizinleri de gösterir
— Michał Niklas

@ MichałNiklas öyle değil.
— Dezso

1
@DarielPratama: koşul tc.constraint_type = 'PRIMARY KEY'yalnızca birincil anahtarları gösterir. Bununla birlikte, her birincil anahtar benzersiz bir dizin tarafından desteklenir
— a_horse_with_no_name

2
@a_horse_with_no_name Bunun yanlış olduğuna inanıyorum. position_in_unique_constraintFOREIGN tuşunun konumunu gösterir, birincil tuşlar için her zaman boştur. Doğru sütun ordinal_position. PG 9.4'te test edilmiştir.
— greatvovan

1
@a_horse_with_no_name Anonim kullanıcı tarafından önerilen bir düzenlemeyi onayladım. Düzenlemenin gerçekleşip gerçekleşmeyeceğinden emin değilim, diğerleri reddetti. Her durumda lütfen greatvovan tarafından öneri ve yorumu kontrol edin. Bence doğru ve ordinal_positionkullanılmalılar. position_in_unique_constraintSadece FKs kullanımındaki boş değil.
— ypercubeᵀᴹ

20

Bu daha doğru bir cevap:

select tc.table_schema, tc.table_name, kc.column_name 
from  
    information_schema.table_constraints tc,  
    information_schema.key_column_usage kc  
where 
    tc.constraint_type = 'PRIMARY KEY' 
    and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
    and kc.constraint_name = tc.constraint_name
order by 1, 2;

Parçayı kaçırdınız and kc.constraint_name = tc.constraint_name, böylece tüm kısıtlamaları listeler.


2
Sorgunuz çalışırken, daha önemli fark eksik and kc.position_in_unique_constraint is not nullkısımdır. Ve ANSI JOIN'leri kullanmanız şiddetle tavsiye edilir (çoğu kişi bunun bir zevk meselesi olduğunu düşünür).
— dezso

1

Lütfen bunu da düşünün. Bu, tüm tabloları değiştirmek için komut dosyası oluşturur.

SELECT STRING_AGG(FORMAT('ALTER TABLE %s CLUSTER ON %s;', A.table_name, A.constraint_name), E'\n') AS SCRIPT
FROM
(
    SELECT      FORMAT('%s.%s', table_schema, table_name) AS table_name, constraint_name
    FROM        information_schema.table_constraints
    WHERE       UPPER(constraint_type) = 'PRIMARY KEY'
    ORDER BY    table_name 
) AS A;

Soru, tabloların nasıl değiştirileceğini sormuyor.
— ypercubeᵀᴹ

1
@ Ypercubeᵀᴹsays ne ikinci. Bu yanıtı silin, ancak cesaretiniz kırılmasın - tura katılın, yardım merkezini ziyaret edin ve "size yardım etmemize yardımcı olun" blogunu okuyun. Sorulmamış bir şeyi cevaplamak gelince, hepimiz çok kez yaptık :-). ps foruma hoş geldiniz!
— Vérace

1

Ben birincil anahtar almak ve yabancı anahtar böyle yapmak gerektiğini düşünüyorum. kc.position_in_unique_constraint null değil Bu koşul yalnızca yabancı anahtarlar alabilir.

select tc.table_schema, tc.table_name, kc.column_name,tc.constraint_type
from 
    information_schema.table_constraints tc
    JOIN information_schema.key_column_usage kc 
        on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema 
                and kc.constraint_name = tc.constraint_name
where 
--kc.position_in_unique_constraint is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

Böyle bir şey yapmaya çalışıyorum (tablo adları biraz farklı, muhtemelen postgres farklı bir sürümü üzerinde). Sorgu çalışır, ancak herhangi bir sonuç geri alamıyorum. Doğru izinlere sahip olmam mümkün mü?
— szeitlin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.