查找数据库表的唯一约束

时间:2009-11-04 14:47:30

标签: java sql oracle unique constraints

我正在尝试使用Java找到表的唯一约束(在Oracle数据库上,但这应该没有区别)。

由于DatabaseMetaData的getPrimaryKeys(....),我找到了一种方法来发现表的主键。 然而,我无法找到表格的独特构成,互联网无法帮助我,因此我在这里结束问我的问题:)

是否有一种干净的方法可以找到一个表的唯一约束(或者更确切地说,一个表必须是唯一的列的名称......那么你得到它嘿嘿)? 最好的问候,

尼尔斯

4 个答案:

答案 0 :(得分: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 :(得分:0)

如果Oracle为唯一约束创建索引(我不知道它是否存在,您需要检查),而不是通过getIndexInfo()

找到有关约束的索引

答案 2 :(得分:0)

唯一约束通常由索引强制执行。也许使用DatabaseMetaData.getIndexInfo()来查找非唯一为假的索引?

答案 3 :(得分:0)

由于大多数数据库将这些约束存储为索引,因此您可以使用前面提到的DatabaseMetaData.getIndexInfo()。当使用 Postgresql 时,这对我很有用。

使用getIndexInfo()作为true调用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()); } - 如果为true,则仅返回唯一值的索引;什么时候不对   返回索引,无论是否唯一

使用以下代码:

getUniqueConstraints(conn, "public", tableName);
你可以致电:

{{1}}

并获取给定表的所有唯一约束的列表。约束按索引分组,因为如果一个索引仅在组合中是唯一的,则可以覆盖多个列。

相关问题