检索由触发器生成的主键(Java)

时间:2015-12-23 20:02:36

标签: java mysql database triggers

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

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

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

如果通过触发器生成主键,是否可以以这种方式检索生成的主键?

更新:我已经尝试将Statement.RETURN_GENERATED_KEYS替换为具有主键列名称的String数组,但这似乎也不起作用。

我为不包括我的代码而道歉,但我很难这样做。我试图尽我所能来描述我正在做的事情。

1 个答案:

答案 0 :(得分:0)

我在另一篇文章中看到了这一点。声称工作。这是你的样子吗?

import java.net.URL;
import java.util.ResourceBundle;
import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import org.controlsfx.control.Notifications;


public class FXMLDocumentController  implements Initializable   {

@FXML
private Label label;

@FXML
private void handleButtonAction(ActionEvent event) {
    Stage stage = (Stage) label.getScene().getWindow();
    stage.hide();
}

public void createNotification() {

    Notifications.create()
            .text("This is a Notification")
            .title("Notifications")
            .showInformation();
}

@Override
public void initialize(URL url, ResourceBundle rb) {

 Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
          Platform.runLater(()->createNotification());
        }

    }, 5000, 10000);
}

}

我使用了SP,这是我所做的一个例子。我用一个进/出的parm来取回它......

Statement stmt = db.prepareStatement(query,  Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
    risultato=rs.getInt(1);
}