java - metaData.getPrimaryKeys()

DatabaseMetaData的用法 一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二. 方法getTables的用法 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schema,String tableName,String []type)... 阅读详情

java - metaData.getPrimaryKeys() 在 key 为单个时返回四个相同的记录

我正在使用 java 中的以下代码检索表的主键:


表 global_settings 只有一个主键列,即 global_setting_id。
但是,循环似乎运行了四次,输出为:




但是,对于具有复合键的表,循环可以正常工作,例如对于表 user_info ,它具有构成复合主键的三列,即 (user_id,national_id,taxation_id),

循环提供如下输出:




我正在使用mysql,驱动程序是(和5.xx和8.xx无关)



这有点微不足道,但仍然是我正在做的任务的一个问题。这是我这边的错误还是问题?

 

最佳答案

所以,在放弃了一段时间后,我在尝试其他东西时不小心偶然发现了这个问题。背景是我有四个数据库,其中一些表共享相同的表名,例如 user_accounts、global_settings 等。
我发现的问题是:

  • 我没有在key的参数中指定手头的表属于哪个数据库。


  • 正确的做法是



    我没有指定数据库的原因是因为我认为连接字符串即



    使操作非常特定于指定的数据库。
    我错过了关注 documentation 的内容声明:

     

    catalog - a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search


  • 我正在连接的用户拥有所有其他四个数据库的所有权限。这意味着不指定我要连接的数据库允许“入侵”从用户也可以访问的其他数据库中的表中获取主键列。正如我刚刚解释的那样,我不知道单个数据库连接允许这种“侵入式”操作。
  • 现在,您可能想知道为什么我不能只指定数据库并停在那里。好吧,该项目的结构方式是,我使用相同的程序来切换连接,具体取决于正在访问的组织数据库,方法是使用组织 ID 从主数据库中获取连接字符串。我错过的是从主数据库中的连接表中获取组织数据库名称。

    所以这是我为了得出这个结论而执行的测试用例:

  • 创建两个数据库smu_teachers、smu_farmers;
  • 创建表 user_accounts 但在每个数据库中具有不同的主键名称,即
    smu_teacher
CREATE TABLE `user_accounts` (
       `user_identity` int(11) NOT NULL AUTO_INCREMENT,
       `username` varchar(50) NOT NULL,
       `surname` varchar(50) NOT NULL,
       `first_name` varchar(50) DEFAULT NULL,
       PRIMARY KEY (`user_identity`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

对于 smu_farmers

CREATE TABLE `user_accounts` (
       `user_identity` int(11) NOT NULL AUTO_INCREMENT,
       `username` varchar(50) NOT NULL,
       `surname` varchar(50) NOT NULL,
       `first_name` varchar(50) DEFAULT NULL,
       PRIMARY KEY (`user_identity`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
GRANT ALL PRIVILEGES ON `smu_%`.* TO `smu_root`@`%`
GRANT ALL PRIVILEGES ON `smu_teachers`.* TO `smu_teachers_user`@`%`
@Test
public void getPrimaryKeys() throws Exception {
    DatabaseMetaData databaseMetaData = null;
    ResultSet rs = null;
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/smu_teachers_corp?" +
                    "autoReconnect=true&allowMultiQueries=true&useSSL=false&createDatabaseIfNotExist=false&allowPublicKeyRetrieval=true",
            "smu_root", "smu_root_password");
    try {
        databaseMetaData = connection.getMetaData();
        rs = databaseMetaData.getPrimaryKeys(null, null, "user_accounts");
        ResultSetMetaData resultSetMetaData = rs.getMetaData();
        while (rs.next()) {
            System.out.println(rs.getString("COLUMN_NAME"));
            for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
                System.out.println("Label: " + resultSetMetaData.getColumnLabel(i) + "  Value:" + rs.getString(i));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

输出:
user_identity
Label: TABLE_CAT  Value:smu_farmers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:user_identity
Label: KEY_SEQ  Value:1
Label: PK_NAME  Value:PRIMARY
user_id
Label: TABLE_CAT  Value:smu_teachers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:user_id
Label: KEY_SEQ  Value:1
Label: PK_NAME  Value:PRIMARY
username
Label: TABLE_CAT  Value:smu_teachers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:username
Label: KEY_SEQ  Value:2
Label: PK_NAME  Value:PRIMARY
 
user_identity
Label: TABLE_CAT  Value:smu_farmers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:user_identity
Label: KEY_SEQ  Value:1
Label: PK_NAME  Value:PRIMARY
  • 使用用户 smu_teachers 运行测试程序,同时指定和不指定数据库名称会产生:

     
user_id
Label: TABLE_CAT  Value:smu_teachers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:user_id
Label: KEY_SEQ  Value:1
Label: PK_NAME  Value:PRIMARY
username
Label: TABLE_CAT  Value:smu_teachers
Label: TABLE_SCHEM  Value:null
Label: TABLE_NAME  Value:user_accounts
Label: COLUMN_NAME  Value:username
Label: KEY_SEQ  Value:2
Label: PK_NAME  Value:PRIMARY
 

  

 

MTK metadata中AF模块的移除与配置调整 本文详细介绍了在MTK平台Camera开发中如何移除metadata中的AF(自动对焦)模块。通过系统清理MTK_CONTROL_AF_REGIONS、MTK_CONTROL_MAX_REGIONS等关键配置项,并调整对焦模式及硬件特性声明,确保定制化设备在禁用自动对焦功能后的稳定运行。 阅读详情

相关推荐

DC-DC电源芯片SY8303电路设计

SY8303高效率同步降压DC-DC转换器。这款芯片特别适用于需要较大负载电流(高达3A)的应用。SY8303在较宽的输入电压范围(4.5V至40V)内工作,能够将输入电能高效地转换为输出电能。此外,为使运行更为稳定,SY8303集成了主要的开关和同步开关,其导通电阻(RDS(ON))非常低,可以最大限度地减少导通损耗。一些特性,如短路保护、热关断以及自动恢复等,也有助于增强其可靠性和耐用性。

LuDvei的博客 9671

数据库元数据

元数据:描述数据的数据 三类:数据库元数据、参数元数据、结果集元数据 数据库元数据 DataBaseMetaData 数据库元数据包括 数据库名 数据库版本信息 驱动名 url 用户名 只要记住 Connection ->databasemetadata->. 数据库元数据的获取方法即可 Connection conn= getdatasourceClass.getdatasourceFunction().getConnection(); DatabaseMetaData ...

sharesb的博客 1145

解决mamba_ssm库安装难题:两种高效方法详解

本文详细解析了mamba_ssm库安装失败的常见原因,并提供了两种高效的解决方案。针对其依赖C++/CUDA扩展编译的特性,文章手把手指导用户通过GitHub克隆源码编译安装,或寻找匹配的预编译Wheel文件直接安装,帮助开发者彻底解决环境配置难题,顺利部署Mamba模型。

weixin_29056865的博客 553

DatabaseMetaData类

DatabaseMetaData类 DatabaseMetaData类是Java.sql包中的类,利用它可以获取我们连接到的数据库的结构、存储等很多信息。如:          1、数据库与用户,数据库标识符以及函数与存储过程。          2、数据库限制。          3、数据库支持不支持的功能。          4、架构、编目、表、列和视图等。      

一杯咖啡 1285

APO的全面进化之路(2):走向IBP、建设端到端供应链计划体系

前一篇记录阐述了在供应链计划(Supply Chain Planning)领域里SAP的关键产品APO的不断进化之路,即部分产品从APO进化到S/4HANA,本篇将继续阐述进化之路上的另一大中坚产品力量SAP-IBP(Integrated Business Planning)。作为SAP数字化供应链(Digital Supply Chain)中供应链计划SCP的左膀右臂,S/4HANA与IBP共同完善了计划域的完整闭环。本篇作为收尾,在先谈对IBP产品的个人认知之前,特别是在当今这个IT产品迭代多、技术革新

ChampaignWolf的专栏 5227

全国各省份影像下载地址(11级别)

cesium中使用urltemplate加载,leaflet中使用tile加载,具体加载有问题可以给我留言。

资深三维GIS开发 5142

元数据

元数据指的是数据的数据,建议操作时用ojdbc7.jar,其他版本的jar包可能对某些方法不支持! 分为三类: 1.数据库元数据(DataBaseMetaData) (借助Connection获取元数据) public static void databaseMetaData() { try { Class.forName(DRIVERE); Conne...

JAVA领域优秀创作者 1511

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1331

DatabaseMetaData详解

在Java中,接口提供了关于数据库的元数据信息。通过这个接口,我们可以获取有关数据库的各种信息,如表、视图、存储过程、触发器等的详细信息。它是Java Database Connectivity(JDBC)的一部分,为开发人员提供了访问数据库元数据的便捷途径。通过本文的简要介绍,相信你对有了更清晰的认识。这个强大的接口为我们在Java中与数据库打交道提供了更多可能性。希望你能够在数据库探秘的旅程中发现更多有趣的事物,用代码书写你的数据库冒险传说!

技术研究中心 1126

qtcreator使用远程服务器编译代码

我并没有找到很好的windows上可以用的rsync工具,最后是装了wsl来调用rsync同步到代码后,在用ssh调用linux命令来编译的。安装wsl安装ubuntu启动wsl然后把windows里的ssh文件证书和配置复制到wsl里同时config的key目录需要改一下,这样就可以登录服务器了然后在home目录创建build.sh进行远程编译。

习惯就好zz的专栏 1380

eNSP中玩转Python自动化——解锁网工新姿势(一)

Python自动化一、安装Paramiko模块二、搭建实验环境1、桥接电脑网卡2、配置交换机IP地址交换机配置测试ensp的交换机与电脑的连通性:交换机配置SSHXshell验证三、Python脚本1、执行python脚本2、同步成功 一、安装Paramiko模块 首先安装Python3 然后安装pip解释器 最后安装Paramiko模块 Windows+R打开Cmd,输入命令: pip3 install paramiko 进入python,导入 paramiko模块: import paramiko

LiBai'S BLOG 2万+

java查询oracle数据库_java 查询oracle数据库所有表DatabaseMetaData的用法

DatabaseMetaData的用法(转)一.得到这个对象的实例Connection con ;con=DriverManager.getConnection(url,userName,password);DatabaseMetaData dbmd= con.getMetaData();二.方法getTables的用法原型:ResultSet DatabaseMetaData.getTables...

weixin_29253711的博客 711

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1149

java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

一 . 得到这个对象的实例Connection con ;con = DriverManager.getConnection(url,userName,password);DatabaseMetaData dbmd = con.getMetaData();二. 方法getTables的用法原型:ResultSet DatabaseMetaData.getTables(String catalog,...

weixin_29655399的博客 549

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdbc----MetaData,queryForMap,queryForObject

[code] DatabaseMetaData的用法 一 、得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二、方法getTables的用法 原型: ResultSet D...

z466459262的专栏 174

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdbc元数据DataBaseMetaData查询数据库表信息详解

一 . 得到这个对象的实例二. 方法getTables的用法原型:此方法可返回结果集合ResultSet ,结果集中有5列, 超出会报越界异常功能描述:得到指定参数的表信息参数说明:参数:catalog:目录名称,一般都为空.参数:schema:数据库名,对于oracle来说就用户名参数:tablename:表名称参数:type :表的类型(TABLE | VIEW)注意:在使用过程中,参数名称必须使用大写的。否则得到什么东西。检索给定目录中可用表的描述。

allway2的博客 925

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur

执行存储过程时,出现如下错误: java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessT...

记事本 831

如何得到一个表的主键列名?

想要得到一个表的主键列名怎么办?当然,表的主键不止一个。  ---------------------------------------------------------------   DatabaseMetaData.getPrimaryKeys  ---------------------------------------------------------------   impor

HotJava 1129

jdbc 得到表结构、主键

转自博客:http://blog.csdn.net/ocean1010/article/details/7266042 假设有个con DatabaseMetaData dbmd = con.getMetaData(); rs = dbmd.getColumns(con.getCatalog(), schema, tableName, null); rs.getString(DATA_TYPE)

ickes的专栏 1054

Clojure.java.jdbc DDL操作教程:创建表、索引与元数据管理

Clojure.java.jdbc是Clojure语言中用于JDBC数据库操作的核心库(前身为clojure.contrib.sql),提供了简洁高效的数据库定义语言(DDL)操作能力。本文将详细介绍如何使用Clojure.java.jdbc进行表创建、索引管理和元数据查询,帮助开发者快速掌握数据库架构设计的关键技能。 ## 🌟 快速入门:表创建基础 创建数据库表是任何应用的基础操作,Clo

gitblog_00285的博客 958

Java 原生 JDBC 代码增删改查、存储过程、获取字段信息、主外键信息、元数据、Long、CLOB、BLOB、NVARCHAR2

目录 Semaphore 概述 常用方法 使用示例 Semaphore 概述 public class java.util.concurrent.Semaphore implements java.io.Serializable { 1、JDK1.5 提供的 Semaphone 计数信号量维护了一个许可证集,线程中调用acquire() 方法从 Semaphone 中获取许可证,得...

蚩尤后裔-汪茂雄 2551

java 数据库获取主键_Atitit 获取数据库表主键功能的实现 数据库模块 艾提拉attilax总结 package com.attilax.sql; import java.sql.Co...

Atitit 获取数据库表主键功能的实现 数据库模块 艾提拉attilax总结packagecom.attilax.sql;importjava.sql.Connection;importcom.attilax.util.MybatisUtil;publicclassDbMetaServiceTest{publicstaticvoidmain(String[]args){C...

weixin_42122340的博客 170

java获取mysql表的主键_[简单]jdbc得到表的主键字段

代码如下:public void getMysqlTablePK(String tableName) throws Exception {Connection conn = getMysqlConnection();ResultSet rs = null;// 适用mysqlrs = conn.getMetaData().getPrimaryKeys(conn.getCatalog().toUpp...

weixin_36087469的博客 957

DatabaseMetaData的用法(转)

一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二. 方法getTables的用法 原型: ResultSet DatabaseMetaData.getTables(Str

pf1234321的专栏 799

【JDBC学习】之元数据day_12

元数据:代表数据库、表、列的信息; 一、获取数据库元信息 主要使用的类是:DatabaseMetaData 获取数据库元信息的方法: 利用Connection对象来获取: Connection.getMetaData()返回DataBaseMetaData对象; DataBaseMetaData对象 getURL():返回一个String类对象,代表数据库

温故而知新 541

Apache Arrow 实现状态全景指南:跨语言数据类型、IPC、Flight RPC 与格式支持能力对照

本文基于 Apache Arrow 官方文档《Implementation Status》展开,系统梳理当前仓库(arrow 12.x)中 C++、Java、Go、JavaScript、C#、Rust、Julia、Swift、nanoarrow 等官方库对 Arrow 列式格式各功能维度的实现进度:包括基础与嵌套数据类型、View 类型(Binary/Utf8 View、List View)、IP

gitblog_00738的博客 434
上一篇: RowKey设计——避免使用时序或单调(递减/递增)行键
下一篇: 删除自增的主键
code_aliu
博客等级 码龄5年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值