我试图找到使用Java(在Oracle数据库上,但应该没有区别)的表的唯一约束。查找数据库表的唯一约束条件
由于DatabaseMetaData的getPrimaryKeys(....),我发现了一种发现表的主键的方法; 但是,我无法找到表的独特的constaints,互联网是无法帮助我,因此我在这里结束询问我的问题:)
有没有一种干净的方式来找到唯一的约束(或者,相反,列的名称必须是唯一的表......那么你得到它嘿)一张桌子? 最好的问候,
尼尔斯
我试图找到使用Java(在Oracle数据库上,但应该没有区别)的表的唯一约束。查找数据库表的唯一约束条件
由于DatabaseMetaData的getPrimaryKeys(....),我发现了一种发现表的主键的方法; 但是,我无法找到表的独特的constaints,互联网是无法帮助我,因此我在这里结束询问我的问题:)
有没有一种干净的方式来找到唯一的约束(或者,相反,列的名称必须是唯一的表......那么你得到它嘿)一张桌子? 最好的问候,
尼尔斯
可以查询数据字典:
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
谢谢文森特,这是我正在寻找的!非常感谢 ! – Nils
如果甲骨文唯一约束创建索引(我不知道,如果是的话,你需要检查),比您可以通过getIndexInfo()
是的,Oracle在UNIQUE约束中标识的任何列上创建一个唯一索引 - 这就是它强制唯一性的方式。 – DCookie
但是,唯一索引可能完全以Oracle为中心。如果需要通用的解决方案,这在所有情况下可能都不是这样。 – DCookie
而且,我认为Oracle也可以使用非唯一索引来执行唯一约束。 – erikkallen
了解您的限制约束通常由索引强制执行。也许使用DatabaseMetaData.getIndexInfo()
找到非唯一性为假的索引?
由于大多数数据库都将这些约束条件存储为索引,因此可以使用DatabaseMetaData.getIndexInfo()(如前所述)。这在使用Postgresql时效果很好。
与第4个参数来调用getIndexInfo()
为true
这是唯一重要的,因为documenation说:
unique
- 如果为true,只返回唯一值的索引;当假,无论是否独特与否
用下面的代码 回报指数:
// 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);
,并取回所有的独特的列表给定表的约束。约束按索引分组,因为一个索引可以覆盖多个列,如果它们只是组合的唯一列。
因此,我收集你宁愿没有Oracle特定的解决方案? – DCookie