2009-11-04 3 views
8

J'essaie de trouver les contraintes uniques d'une table en utilisant Java (sur une base de données Oracle, mais cela ne devrait faire aucune différence).Trouver la contrainte unique d'une table de base de données

J'ai trouvé un moyen de découvrir les clés primaires d'une table, grâce à getPrimaryKeys de DatabaseMetaData (....); Cependant, je n'ai pas réussi à trouver les constantes uniques des tables, et Internet n'a pas pu m'aider, donc je termine ici posant ma question :)

Existe-t-il un moyen propre de trouver les contraintes uniques (ou, plutôt, le nom des colonnes qui doit être unique pour une table .. Eh bien, vous l'obtenez hehe) d'une table? Meilleures salutations,

Nils

+0

Donc, je suppose que vous préférez ne pas avoir une solution spécifique à Oracle? – DCookie

Répondre

20

vous pouvez interroger le dictionnaire de données:

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

Merci Vincent, c'est EXACTEMENT ce que je cherchais !! Merci beaucoup ! – Nils

0

Si Oracle crée des index des contraintes uniques (je ne sais pas si cela est le cas, vous devez vérifier) ​​que vous pouvez connaître vos contraintes via getIndexInfo()

+0

Oui, Oracle crée un index unique sur toutes les colonnes identifiées dans une contrainte UNIQUE - c'est ainsi qu'il renforce l'unicité. – DCookie

+0

Cependant, les index uniques peuvent être complètement centrés sur Oracle. Si une solution générique est nécessaire, cela peut ne pas être vrai dans tous les cas. – DCookie

+0

Et, je pense qu'Oracle peut aussi utiliser un index non-unique pour imposer une contrainte unique. – erikkallen

0

Les contraintes uniques sont généralement appliquées par un index. Peut-être utiliser DatabaseMetaData.getIndexInfo() pour trouver les index où le non-unique est faux?

0

Étant donné que la plupart des bases de données stockent ces contraintes en tant qu'index, vous pouvez utiliser DatabaseMetaData.getIndexInfo() comme indiqué précédemment. Cela a bien fonctionné pour moi lors de l'utilisation Postgresql.

Il est seulement important d'appeler getIndexInfo() avec le 4ème paramètre comme true comme Documenation dit:

unique - lorsqu'il est vrai, seuls indices pour retourner des valeurs uniques; lorsque faux, indices de rendement, peu importe qu'il soit unique ou non

Avec le code suivant:

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

vous pouvez appeler:

getUniqueConstraints(conn, "public", tableName); 

et retourner une liste de tous les uniques contraintes pour une table donnée. Les contraintes sont regroupées par index car un index peut couvrir plusieurs colonnes si elles ne sont uniques qu'en combinaison.

Questions connexes