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

2024-05-06

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

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

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

这是代码:

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

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

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|
+----+----+----------+-------+----------+----+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当键是复合键时,metaData.getPrimaryKeys() 返回单行 的相关文章

  • 如何用 JSON 表示数据库中的图像

    我需要基于数据库中的 blob 创建 JSON 为了获取 blob 图像 我使用下面的代码并在 json 数组中显示之后 Statement s connection createStatement ResultSet r s execut
  • Flask 管理数据库连接:内存:

    我有一个烧瓶应用程序 需要存储请求中的一些信息 这些信息的生命周期非常短暂 如果服务器重新启动 我就不再需要它了 所以我真的不需要持久性 我读过了here https stackoverflow com questions 11113903
  • 还有其他方法可以在 python sqlite3 模块中导入数据文件(如 .csv)吗? 【不一一插入】

    在 sqlite3 的客户端 CLI 中 有 import file TABLE name 来执行此操作 但是 我目前不想将 sqlite3 安装到我的服务器上 在python sqlite3模块中 我们可以创建和编辑数据库 但是 我还没有
  • 将 SQLite 与经典 ASP 结合使用

    我正在构建一个 快速小 应用程序 它需要一个小型数据库 我想使用经典 ASP 即不是 ASP NET 并且我想知道 SQLite 用于数据库 可以使用 Classic ASP 中的 SQLite 吗 如何从 ASP 打开 创建 使用 SQL
  • 如何处理 SQLite 缺少的功能:禁用触发器?

    如何处理 SQLite 缺失的功能 disable triggers 我没有让它存储特定表的触发器名称 例如 我如何删除所有触发器 你会怎么办 现在已经是 2015 年了 SQLite 中仍然没有 禁用触发器 对于移动应用程序来说 这可能会
  • Spring boot JDBC无法连接docker容器中的mysql

    我正在尝试在两个单独的 docker 容器中运行 spring boot 应用程序 作为简单的 REST api 和 mysql 服务器 但是 我无法在 Spring 应用程序中获取 jdbc 连接来连接 mysql 它们都是独立工作的 当
  • Laravel - 调用未定义的方法 Illuminate\Database\Query\Builder::user()

    我正忙于Laravel 从头开始 更新记录和预加载 https laracasts com series laravel 5 from scratch episodes 10 我已经遵循了该教程 但在尝试在 CardsController
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • Eclipse 中有 SQLite 数据库查看器工具吗?

    我正在使用 Eclipse 进行 Android 编程 有没有可以在模拟器中查看SQLite数据库的工具 请参阅博客文章在 Eclipse 中浏览 Android 模拟器 SQLite 数据库 http www tylerfrankenst
  • 如何在sqlite中创建物化视图?

    我对物化视图和 SQLite 进行了无数次搜索 据我所知 2004 年和 2006 年似乎有人提到 SQLite 没有物化视图 紧随其后的是 SQLite 的变更日志2008年3月 http www sqlite org releaselo
  • 如何使用 Sqlite3 用列表中的值更新整个列

    我有一个数据集本地存储在 sqlite3 数据库中 我提取了一列 执行了一些操作 现在想要替换数据库列中的所有值 我怎样才能做到这一点 保证列和列表的长度相同 我只想用新值更新表 有没有一种简单的方法可以一次性完成这一切 使用Python
  • Glassfish 4 - JDBC 领域

    Glassfish 4 中的密码加密算法和摘要算法有什么区别 因为Password加密算法不能为空 所以我使用了MD5 Encoding使用了Hex 摘要算法为空 因此默认为 SHA 256 但是 如果我使用 JAAS 制作一个简单的登录应
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • SQL Server“伪/合成”复合 Id(key)

    抱歉 但我不知道如何在标题中调用我需要的内容 我想创建一个唯一的密钥 其中数字的每两位数字都标识其他表 PK 假设我在这 3 个表中的 Pks 如下 Id Company Id Area Id Role 1 Abc 1 HR 1 Assis
  • iphone sqlite 静态链接?

    有人静态链接 sqlite 而不是使用动态链接 吗 我遇到的问题是 越狱手机的用户没有与普通 iPhone 所采用的 sqlite 版本相同的版本 因此导致崩溃 我假设在我的应用程序中静态链接已知版本的 sqlite 就是答案 我需要全文支
  • 在 SQL Server 中,如果主键是 GUID,如何按插入顺序对表行进行排序?

    我开始在主键中使用 GUID 而不是自动增量整数 然而 在开发过程中 我习惯于查询 从 SQL Management Studio 或 Visual Studio 数据库 以查看我的应用程序刚刚插入的记录 并且我对无法按主键 desc 顺序
  • SQL 错误:“没有这样的表”

    我试图解决为什么我的代码为所有查询返回 null 的原因 最后发现 sql 查询什么也没有返回 我使用简约代码创建了一个新的 AIR 文档 s WindowedApplication
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio

随机推荐