2016-08-11 4 views
0

私は、各列で使用される制約の種類を含め、データベース上のすべての種類のデータを収集する必要があるものを作成しています。残念ながら、列に制約を追加するには2つの方法があります(またはそれ以上に私が気付いていない場合)、UNIQUE CONSTRAINTを追加するか、UNIQUEでINDEXを追加することができます。インデックスの制約を取得するには?

私はこのクエリを持っている:

select * from information_schema.table_constraints WHERE constraint_type='UNIQUE';

しかし、問題は、それはINDEXに適用されているUNIQUE制約を検出しません、それだけで、たとえば、自分でUNIQUE制約を検知することで、それができませんこれは、検索:

Indexes: "index_videos_on_slug" UNIQUE, btree (slug)

は、誰もが、私は、この情報を得ることができる方法を知っていますか?ありがとう。 pg_catalogスキーマ

  • information_schemaでのライブ

  • +0

    'pg_index.indisunique'を上に構築されていinformation_schema''注意pg_catalogの要素だけが含まれています) – joop

    +0

    @joop、私は実際に答えとして投稿するべきだと思っています – e4c5

    +0

    ええと、その情報を表と列名にリンクするにはどうすればいいですか?それは私がそれを照会するときにうっとりしているように見えます。私はrelidを何らかの形でリンクしなければならないと思いますか? – b0xxed1n

    答えて

    1
    • the postgres catalogs
    • (ビューのセットとして)、この上に構築されINFORMATION_SCHEMAは(ANSI委員会によって決定されただけのものが実装されている、完全ではありません

    )多かれ少なかれ、すべての実装のGCD)
  • インデックスはSQLの一部ではありません(ただし、ほとんど/すべてのSQL実装がそれらを持っています

    pg_index.indisunique(pg_catalogスキーマ内)が必要です。

    ところで:あなたが制約に既存のインデックスを促進したい場合は、alter ... using ...構文を使用することができます(pg_catalogのスキーマ内)

    ALTER TABLE ... ADD constraint ... USING your_index_name; 
    
  • +0

    ありがとうございます。 'pg_index'の' pg_stat_all_indexes'が 'pg_index'の' 'indexrelid''を指しているのを発見しました。' 't''や' f''の '' indisunique''をチェックするだけです。あなたがより良い方法を考えることができるなら、私に知らせてください。 – b0xxed1n

    +0

    特に、development/test/etcのために別々のスキーマがある場合は、schemaname(pg_namespace)をチェックするのを忘れないでください。 – joop

    +1

    @ b0xxed1n '' t''と '' f''は単に 'true'と' false'のためのテキスト出力ですので、 'WHERE indisunique = 't''、' WHERE indisunique = true'と 'WHERE indisunique'はすべて同じことを意味します。 – IMSoP

    関連する問題