gpt4 book ai didi

sqlite - metaData.getPrimaryKeys() 在组合键时返回单行

转载 作者:行者123 更新时间:2023-12-03 17:02:10 25 4
gpt4 key购买 nike

我在使用 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();
}

最佳答案

您似乎遇到了这个问题: 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)
)

不会正确报告主键(因为当正则表达式无法匹配任何内容时回退逻辑中存在另一个错误,该错误导致仅报告最后 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|
+----+----+----------+-------+----------+----+

关于sqlite - metaData.getPrimaryKeys() 在组合键时返回单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com