java—查找数据库表的唯一约束

l7mqbcuq  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(647)

我正在尝试使用java(在oracle数据库上,但这应该没有什么区别)查找表的唯一约束。
由于databasemetadata的getprimarykeys(…),我找到了一种发现表主键的方法;然而,我找不到table的独特结构,互联网也帮不上我的忙,所以我在这里问我的问题:)
有没有一种干净的方法可以找到唯一的约束(或者,更确切地说,是表中必须唯一的列的名称)。。嗯,你明白了吗(呵呵)一张table?致以最诚挚的问候,

soat7uwm

soat7uwm1#

如果oracle为唯一约束创建索引(我不知道是否创建了索引,您需要检查),那么您可以通过 getIndexInfo()

ltskdhd1

ltskdhd12#

唯一约束通常由索引强制执行。也许用 DatabaseMetaData.getIndexInfo() 找到非唯一性为false的索引?

lf5gs5x2

lf5gs5x23#

由于大多数数据库将这些约束存储为索引,因此可以使用前面提到的databasemetadata.getindexinfo()。在使用postgresql时,这对我来说非常有效。
重要的是打电话 getIndexInfo() 第四个参数为 true 文件上说: unique -如果为true,则只返回唯一值的索引;如果为false,则返回索引,无论是否唯一
代码如下:

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

并获取给定表的所有唯一约束的列表。约束是按索引分组的,因为一个索引可以覆盖多列(如果它们在组合中是唯一的)。

t2a7ltrp

t2a7ltrp4#

您可以查询数据字典:

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

相关问题