【问题标题】:Retrieving Primary Key Generated By Trigger (Java)检索触发器生成的主键(Java)
【发布时间】:2016-03-30 07:32:37
【问题描述】:

这就是我正在尝试做的事情。我有一个 Java 程序,可以将遥测流分解为各个原始字段。我将这些原始字段值传递到 MySQL 表中,其中每一列都是字段之一。在这个数据库中,我还有一个视图,它可以抓取所有遥测数据并根据原始数据(例如工程单位的原始计数)计算一些新的派生列。在我的 Java 程序中,插入后我想从 VIEW 中获取相应的行(原始 + 派生)并将该数据传递到其他地方。

最初我认为我可以简单地将原始数据插入到 VIEW 中,然后在 Java 程序的 ResultSet 中将行返回给我。不幸的是,数据没有在 ResultSet 中返回。

我现在要做的是将原始数据插入表中(这部分有效),获取主键,然后从 VIEW 中查找行。我正在努力的部分是从 INSERT 中检索主键。我正在使用从我的 Connection 对象生成的 PreparedStatement,并为它提供了 Statement.RETURN_GENERATED_KEYS。但是,当我在调用 executeUpdate() 后对我的语句调用 getGeneratedKeys() 时,我的 ResultSet 始终为空。我可以看到它在运行时将行插入到表中...我做错了什么?

如果主键是通过触发器生成的,我不能以这种方式检索生成的主键吗?

更新:我尝试将 Statement.RETURN_GENERATED_KEYS 换成具有主键列名称的字符串数组,但这似乎也不起作用。

我很抱歉没有包含我的代码,但我很难这样做。我已尽我所能描述我正在做的事情。

【问题讨论】:

    标签: java mysql database triggers


    【解决方案1】:

    我在另一个帖子中看到了这个。这声称有效。这是你的样子吗?

    Statement stmt = db.prepareStatement(query,  Statement.RETURN_GENERATED_KEYS);
    numero = stmt.executeUpdate();
    
    ResultSet rs = stmt.getGeneratedKeys();
    if (rs.next()){
        risultato=rs.getInt(1);
    }
    

    我使用过 SP,这是我所做的一个示例。我使用输入/输出参数将其取回...

    CREATE DEFINER=`scaha`@`localhost` PROCEDURE `updateprofile`(
        IN in_idprofile INT(10),
        IN in_usercode VARCHAR(50),
        IN in_pwd VARCHAR(50),
        IN in_nickname VARCHAR(50),
        IN in_isactive tinyint,
        IN in_updated timestamp,
        OUT out_idprofile INT(10))
    BEGIN
    
    /*  If the idprofile is < 1 then we insert a new record.. */
    /*  otherwise its an update */
    
    if (in_idprofile < 1) then
    
        insert into scaha.profile (usercode, pwd, nickname, isactive,updated) values (in_usercode,in_pwd,in_nickname,in_isactive,in_updated);
        SET out_idprofile = LAST_INSERT_ID();
    
    else 
        update scaha.profile set usercode = in_usercode, pwd = in_pwd, nickname = in_nickname, isactive = in_isactive, updated = in_updated 
        where idprofile = in_idprofile;
        SET out_idprofile = in_idprofile;
    
    end if;
    
    END
    

    【讨论】:

    • 我想避免为看似简单的事情求助于存储过程。不过,SP 始终是这里的一个选项。如果我要走那条路,我应该从 VIEW 中输出行,而不仅仅是主键,因为我使用它的只是检索所述行。
    • 从我上面说的开始。我宁愿不使用存储过程,因为有问题的表有数百列。我宁愿不创建一个有那么多参数的 SP。
    • 我听到你在那个。另一种解决方案可能是在代码中创建一个 uid。插入表中。作为额外的列。然后通过uid拉回来
    • 我可以用与数据库相同的方式计算代码中的主键,但我宁愿不在两个地方定义相同的例程。有很多方法可以做我需要做的事情来让它发挥作用,但我觉得我只是缺少能够让它发挥作用的一个关键组成部分。
    • 我可能已经使用 sp 技巧来解决您遇到的相同问题。那是我几年前写的一个系统
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多