Poiché la maggior parte dei database memorizza questi vincoli come indice, è possibile utilizzare DatabaseMetaData.getIndexInfo() come indicato in precedenza. Ciò ha funzionato bene per me quando si utilizza Postgresql.
E 'solo importante chiamare getIndexInfo()
con il 4 ° parametro come true
come il documenation dice:
unique
- quando vero, restituirà solo gli indici per i valori univoci; quando falso, indici di ritorno, indipendentemente dal fatto unico o no
Con il seguente codice:
// 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());
}
è possibile chiamare:
getUniqueConstraints(conn, "public", tableName);
e tornare un elenco di tutti i unico vincoli per una data tabella. I vincoli sono raggruppati per indice poiché un indice può coprire più colonne se sono uniche in combinazione.
Quindi ho capito che preferiresti non avere una soluzione specifica per Oracle? – DCookie