2009-11-04 22 views
8

Estoy tratando de encontrar las restricciones únicas de una tabla usando Java (en una base de datos Oracle, pero eso no debería hacer ninguna diferencia).Encontrar una restricción única de tabla de base de datos

Encontré una forma de descubrir las Claves Primarias de una tabla, gracias a getPrimaryKeys de DatabaseMetaData (....); Sin embargo, no pude encontrar las constantes únicas de las tablas, y Internet no fue capaz de ayudarme, por lo tanto, termino aquí preguntando :)

¿Hay alguna manera de encontrar las restricciones únicas? o, más bien, el nombre de las columnas que deben ser únicas para una tabla ... ¿Lo entiendes, jeje) de una tabla? Saludos,

Nils

+0

¿Debo entender que preferiría no tener una solución específica para Oracle? – DCookie

Respuesta

20

puede consultar el diccionario de datos:

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

Gracias Vincent, esto es EXACTAMENTE lo que estaba buscando !! Muchas gracias ! – Nils

0

Si Oracle crea índices de restricciones únicas (no sé si lo hace, es necesario comprobar) que puede averiguar acerca de sus restricciones a través de getIndexInfo()

+0

Sí, Oracle crea un índice único en cualquier columna (s) identificada (s) en una restricción ÚNICA: así se impone la exclusividad. – DCookie

+0

Sin embargo, los índices únicos pueden estar completamente centrados en Oracle. Si se necesita una solución genérica, esto puede no ser cierto en todos los casos. – DCookie

+0

Y, creo que Oracle también puede usar un índice no único para imponer una restricción única. – erikkallen

0

Las restricciones únicas generalmente se aplican por un índice. ¿Quizás use DatabaseMetaData.getIndexInfo() para encontrar los índices donde el no único es falso?

0

Dado que la mayoría de las bases de datos almacenan estas restricciones como un índice, puede usar DatabaseMetaData.getIndexInfo() como se mencionó anteriormente. Esto funcionó bien para mí cuando usé Postgresql.

Es sólo importante llamar getIndexInfo() con el cuarto parámetro como true como el Documenation dice:

unique - cuando es verdadero, devolver sólo los índices de valores únicos; cuando es falso, índices de rentabilidad, independientemente de si único o no

Con el siguiente código:

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

puede llamar:

getUniqueConstraints(conn, "public", tableName); 

y obtener una lista de todos los únicos restricciones para una tabla dada. Las restricciones se agrupan por índice, ya que un índice puede abarcar varias columnas si solo son únicas en combinación.

Cuestiones relacionadas