2009-11-04 16 views
8

Javaを使用して(Oracle Databaseでは、違いはありません)、表の一意の制約を検出しようとしています。データベース表の一意制約を確認してください

DatabaseMetaDataのgetPrimaryKeys(....)のおかげで、テーブルの主キーを検出する方法が見つかりました。 しかし、私はテーブルのユニークな制約を見つけることができませんでした、インターネットは私を助けることができなかったので、私はここで私の質問をして終了します:)

一意の制約または、むしろ、テーブルのためにユニークでなければならないカラムの名前..あなたはそれをテーブルのheheに得ますか? 敬具、

ニルス

+0

オラクル固有のソリューションをお持ちではないと思いますか? – DCookie

答えて

20

あなたは、データ・ディクショナリを照会することができます。Oracleは、(それがない場合、私はあなたがチェックする必要があり、知らない)よりも一意性制約のインデックスを作成する場合

SQL> SELECT cc.* 
    2 FROM all_constraints c 
    3 JOIN all_cons_columns cc ON (c.owner = cc.owner 
    4        AND c.constraint_name = cc.constraint_name) 
    5 WHERE c.constraint_type = 'U' 
    6  AND c.table_name = 'T'; 

OWNER  CONSTRAINT_NAME TABLE_NAME  COLUMN_NAME  POSITION 
---------- ----------------- -------------- ------------- ---------- 
VNZ  UNIQUE_COL  T    COLUMN1    1 
VNZ  UNIQUE_COL  T    COLUMN2    2 
VNZ  UNIQUE_COL2  T    COLUMN2    1 
+1

ありがとう、ヴィンセント、これは私が探していたものです!どうもありがとうございます ! – Nils

0

あなたの制約については、getIndexInfo()

+0

はい、OracleはUNIQUE制約で識別された列に対して一意索引を作成します。これは一意性を強制する方法です。 – DCookie

+0

ただし、一意索引は完全にOracle中心です。一般的な解決策が必要な場合、これはすべての場合に当てはまるとは限りません。 – DCookie

+0

また、Oracleは一意でない索引を使用して一意制約を強制することもできます。 – erikkallen

0

を介して調べることができます。一意の制約は、通常、インデックスによって強制されます。おそらく、DatabaseMetaData.getIndexInfo()を使用して、非ユニークなインデックスが偽であるインデックスを見つけるでしょうか?

0

ほとんどのデータベースはこれらの制約をインデックスとして格納するので、前述のようにDatabaseMetaData.getIndexInfo()を使用できます。これは私のためにうまくいきましたPostgresql ; trueの場合、一意の値のための唯一のインデックスを返す -

unique:documenationが言うよう

それはtrueとして4番目のパラメータでgetIndexInfo()を呼び出すことだけが重要ですときにかかわらず、ユニークかどうか

次のコードでの偽、 リターン指数:

getUniqueConstraints(conn, "public", tableName); 

を、すべての独特の一覧を取り戻す:あなたが呼び出すことができます

// Class to combine all columns for the same index into one object 
public static class UniqueConstraint { 
    public String table; 
    public String name; 
    public List<String> columns = new ArrayList<>(); 
    public String toString() { 
     return String.format("[%s] %s: %s", table, name, columns); 
    } 
} 

public static List<UniqueConstraint> getUniqueConstraints(Connection conn, String schema, String table) throws SQLException { 
    Map<String, UniqueConstraint> constraints = new HashMap<>(); 

    DatabaseMetaData dm = conn.getMetaData(); 
    ResultSet rs = dm.getIndexInfo(null, schema, table, true, true); 
    while(rs.next()) { 
     String indexName = rs.getString("index_name"); 
     String columnName = rs.getString("column_name"); 

     UniqueConstraint constraint = new UniqueConstraint(); 
     constraint.table = table; 
     constraint.name = indexName; 
     constraint.columns.add(columnName); 

     constraints.compute(indexName, (key, value) -> { 
      if (value == null) { return constraint; } 
      value.columns.add(columnName); 
      return value; 
     }); 
    } 

    return new ArrayList<>(constraints.values()); 
} 

与えられたテーブルの制約。 1つのインデックスが複数の列をカバーできるのは、組み合わせが一意の場合のみです。

関連する問題