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.