metaData.getPrimaryKeys() 当键是复合的时返回单行

Posted

技术标签:

【中文标题】metaData.getPrimaryKeys() 当键是复合的时返回单行【英文标题】:metaData.getPrimaryKeys() returns a single row when the key is composite 【发布时间】:2017-01-07 21:45:51 【问题描述】:

我在使用 SQLite 驱动程序的 JDBC 中遇到复合主键问题。

当我验证键实际上是由两列组成的复合键时,来自 DatabaseMetaData 对象的 getPrimaryKeys() 方法返回单行。

是否有人对如何检索主键的真实列表有任何建议/替代方法?

代码如下:

DatabaseMetaData meta = con.getMetaData();

ResultSet pks = meta.getPrimaryKeys(null, null, "work_on");
ResultSetMetaData rsmd = pks.getMetaData();
while(pks.next()) 
    for (int i = 1; i < rsmd.getColumnCount(); i++) 
        System.out.print(pks.getString(i) + " ");
    
    System.out.println();

【问题讨论】:

work_on (s_id varchar(4), ... , 主键(s_id, p_id), ...) 它成功地检索了相邻表的两个主键。我不确定为什么它不适用于这个特定的表。 【参考方案1】:

您似乎遇到了这个问题: https://bitbucket.org/xerial/sqlite-jdbc/issues/107/databasemetadatagetprimarykeys-does-not

当前 JDBC 错误的解决方法

JDBC 驱动程序中的错误是与您的 SQL 字符串匹配的错误正则表达式。正则表达式要求在KEY 关键字和左括号之间至少有一个空格。如果你这样写:

create table work_on (
  s_id varchar(4), 
  p_id varchar(4), 
  x varchar(4), 
  primary key(s_id, p_id)
)

不会正确报告主键(因为当正则表达式无法匹配任何内容时,回退逻辑中存在另一个错误,该其他错误导致仅报告 last PK 列)。因此,要解决这个问题,您可以仔细设计您的表格,使其始终具有此空格:

create table work_on (
  s_id varchar(4), 
  p_id varchar(4), 
  x varchar(4), 
  primary key (s_id, p_id)
  --         ^ whitespace here!
)

不使用 JDBC API 的解决方法

您始终可以自己在这里运行此查询(这是 JDBC 驱动程序的后备查询):

pragma table_info('work_on');

然后收集所有将pk 标志设置为true 的行。比如下表

create table work_on (
  s_id varchar(4), 
  p_id varchar(4), 
  x varchar(4), 
  primary key(s_id, p_id)
)

... 产生这个输出:

+----+----+----------+-------+----------+----+
| cid|name|type      |notnull|dflt_value|  pk|
+----+----+----------+-------+----------+----+
|   0|s_id|varchar(4)|      0|null    |   1|
|   1|p_id|varchar(4)|      0|null    |   2|
|   2|x   |varchar(4)|      0|null    |   0|
+----+----+----------+-------+----------+----+

【讨论】:

我无法更改创建表的语法,因为它是由第三方来源提供的。正式承认问题出在空格上,因为提到的相邻表在主键处有适当的空格

以上是关于metaData.getPrimaryKeys() 当键是复合的时返回单行的主要内容,如果未能解决你的问题,请参考以下文章