2009-11-04 2 views
8

Я пытаюсь найти уникальные ограничения таблицы с использованием Java (в базе данных Oracle, но это не имеет значения).Найти уникальное ограничение таблицы базы данных

Я нашел способ открыть Первичные ключи таблицы, благодаря getPrimaryKeys DatabaseMetaData (....); Однако мне не удалось найти уникальные постоянные столы, и Интернет не смог мне помочь, поэтому я заканчиваю здесь, задавая свой вопрос :)

Есть ли чистый способ найти уникальные ограничения (или, скорее, имя столбцов, которые должны быть уникальными для таблицы .. Ну, вы понимаете это) таблицы? С наилучшими пожеланиями,

Nils

+0

Итак, я полагаю, что у вас не будет решения, специфичного для Oracle? – 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

Спасибо Винсент, это ТОЧНО, что я искал !! Спасибо огромное ! – Nils

0

Если Oracle создает индексы для уникальных ограничений (я не знаю, если это произойдет, вам нужно проверить), чем вы можете узнать о своих ограничениях через getIndexInfo()

+0

Да, Oracle создает уникальный индекс для любого столбца (ов), идентифицированного в ограничении UNIQUE, - вот как это обеспечивает уникальность. – DCookie

+0

Однако уникальные индексы могут быть полностью ориентированы на Oracle. Если требуется общее решение, во всех случаях это может быть неверным. – DCookie

+0

И, я думаю, Oracle может также использовать уникальный код для обеспечения уникального ограничения. – erikkallen

0

Уникальные ограничения обычно выполняются индексом. Возможно, используйте DatabaseMetaData.getIndexInfo(), чтобы найти индексы, в которых не уникальное значение false?

0

Поскольку большинство баз данных хранят эти ограничения в качестве индекса, вы можете использовать DatabaseMetaData.getIndexInfo(), как упоминалось ранее. Это хорошо сработало для меня при использовании Postgresql.

Это важно только для вызова getIndexInfo() с 4-го параметра, true как documenation говорит:

unique - когда правда, возвращать только индексы для уникальных значений; когда ложь, возвращаемых индексов независимо от того, уникальных или нет

С помощью следующего кода:

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

вы можете позвонить:

getUniqueConstraints(conn, "public", tableName); 

и получить обратно список всех уникальные ограничения для данной таблицы. Ограничения сгруппированы по индексу, так как один индекс может охватывать несколько столбцов, если они уникальны только в комбинации.

Смежные вопросы