2009-11-04 2 views
8

Java를 사용하여 테이블의 고유 제약 조건을 찾으려고합니다 (Oracle 데이터베이스에서는 차이가 없어야 함).데이터베이스 테이블의 고유 한 제약 조건 찾기

DatabaseMetaData의 getPrimaryKeys (....) 덕분에 테이블의 기본 키를 찾는 방법을 발견했습니다. 그러나 테이블의 독특한 constaints 찾을 수 없습니다 및 인터넷 나를 도울 수 없기 때문에 여기 내 질문을 끝내고 :)

고유 한 제약 조건을 찾을 수있는 깨끗한 방법이 있나요? 또는 오히려, 테이블에 고유해야 컬럼의 이름을 .. 잘 당신은 테이블 hehe 그것을 얻을)? 안부,

닐스

+0

그래서 오라클 관련 솔루션을 갖고 있지 않겠습니까? – DCookie

답변

20

당신은 데이터 사전을 조회 할 수 있습니다 오라클은 (는 않는 경우 당신이 확인해야 모르겠어요) 이상의 고유 제한 조건에 대한 인덱스를 만드는 경우

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

감사합니다. Vincent, 이것은 정확히 내가 찾고 있던 것입니다 !! 정말 고맙습니다 ! – Nils

0

getIndexInfo()

+0

예, Oracle은 UNIQUE 제약 조건에서 식별 된 모든 열에 고유 인덱스를 만듭니다. 이것이 고유성을 적용하는 방법입니다. – DCookie

+0

그러나 고유 색인은 완전히 오라클 중심 일 수 있습니다. 일반 솔루션이 필요한 경우 모든 경우에 해당하지 않을 수 있습니다. – DCookie

+0

그리고 오라클은 고유하지 않은 인덱스를 사용하여 고유 한 제약 조건을 적용 할 수 있다고 생각합니다. – erikkallen

0

고유 제약 조건은 일반적으로 인덱스에 의해 강제됩니다. non-unique가 false 인 인덱스를 찾으려면 DatabaseMetaData.getIndexInfo()을 사용 하시겠습니까?

0

대부분의 데이터베이스는 이러한 제약 조건을 인덱스로 저장하므로 앞서 언급 한대로 DatabaseMetaData.getIndexInfo()을 사용할 수 있습니다. 이것은 Postgresql을 사용할 때 잘 동작했습니다. ; 때 진정한, 고유 값에 대해서만 인덱스를 반환 -

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()); 
} 

당신이 호출 할 수 있습니다 주어진 테이블에 대한 제약 조건. 하나의 인덱스가 여러 개의 컬럼을 포함 할 수 있으므로 제약 조건은 인덱스별로 그룹화됩니다.

관련 문제