我正在尝试使用Java找到表的唯一约束(在Oracle数据库上,但这应该没有区别)。
由于DatabaseMetaData的getPrimaryKeys(....),我找到了一种方法来发现表的主键。 然而,我无法找到表格的独特构成,互联网无法帮助我,因此我在这里结束问我的问题:)
是否有一种干净的方法可以找到一个表的唯一约束(或者更确切地说,一个表必须是唯一的列的名称......那么你得到它嘿嘿)? 最好的问候,
尼尔斯
答案 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}}
并获取给定表的所有唯一约束的列表。约束按索引分组,因为如果一个索引仅在组合中是唯一的,则可以覆盖多个列。