metaData.getPrimaryKeys() returns 组合键时单行
metaData.getPrimaryKeys() returns a single row when the key is composite
我在 JDBC 使用 SQLite 驱动程序时遇到复合主键问题。
DatabaseMetaData
对象 returns 单行的 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)
)
主键不会被正确报告(因为当正则表达式无法匹配任何内容时回退逻辑中存在另一个错误,其他错误只会导致 last PK 列进行报告)。因此,要解决此问题,您可以仔细设计 tables 以始终具有此空白:
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 的行。比如下面的table
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|
+----+----+----------+-------+----------+----+
我在 JDBC 使用 SQLite 驱动程序时遇到复合主键问题。
DatabaseMetaData
对象 returns 单行的 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)
)
主键不会被正确报告(因为当正则表达式无法匹配任何内容时回退逻辑中存在另一个错误,其他错误只会导致 last PK 列进行报告)。因此,要解决此问题,您可以仔细设计 tables 以始终具有此空白:
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 的行。比如下面的table
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|
+----+----+----------+-------+----------+----+