使用自动递增列作为主键的数据插入

时间:2015-09-11 12:33:55

标签: java sql foreign-keys auto-increment foreign-key-relationship

我有两个表,其中主键(另一个表上的外键)在运行时自动递增(使用TOAD for mysql)。 如何使用事务同时将数据插入到两个表中。

这是第一个表的ddl:

CREATE TABLE `suspendedsales` (
`SID` int(11) NOT NULL AUTO_INCREMENT,
`SequenceNo` int(11) NOT NULL DEFAULT '0',
`ProductCode` varchar(100) DEFAULT NULL,
`ItemName` varchar(100) DEFAULT NULL,
`Quantity` int(11) DEFAULT NULL,
`Discount` double DEFAULT NULL,
`ItemCost` double DEFAULT NULL,
PRIMARY KEY (`SID`,`SequenceNo`),
CONSTRAINT `SIDFKey` FOREIGN KEY (`SID`) REFERENCES `suspendedsalesdetails` (`SID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

第二个表的ddl:

CREATE TABLE `suspendedsalesdetails` (
`SID` int(11) NOT NULL DEFAULT '0',
`Date` date DEFAULT NULL,
`Total` double DEFAULT NULL,
PRIMARY KEY (`SID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

N.B:主要的挑战是在运行时将主键上的自动递增键值插入到另一个表中。

感谢您的期待。

2 个答案:

答案 0 :(得分:0)

如果您的数据库是MySql数据库,则可以在第一个表中插入记录,使用以下函数

SELECT LAST_INSERT_ID();

获取最后插入的ID,您可以在第二个插入中使用它。仅在第二次插入后提交所有内容

答案 1 :(得分:0)

这个怎么样:

 private void insert() {

    OraclePreparedStatement statement = null;


    try {
        Connection dbConnection = getConnection();
        statement = dbConnection.createStatement(); 

        String insertToSuspendedsales  = "insert into suspendedsales (SequenceNo, ProductCode,ItemName,Quantity,Discount,ItemCost) "
            + "values(:segNo, :prodNo, :itmeName, :quantity, :discount, :itemCost) returning SID into ?";

        statement.setIntAtName("segNo", intValue);
        ....

        int id =  statement.registerReturnParameter(1, OracleTypes.INTEGER)
        statement.executeUpdate(insertToSuspendedsales);

        String insertToSuspendedsalesdetails = "insert into suspendedsalesdetails (SID, Date, Total) "
            + "values(:sid, :date, :total) returning SID into ?";


        statement.setIntAtName("sid", id);
        .... 

        statement.executeUpdate(insertToSuspendedsalesdetails);

    } catch (SQLException ex) {
        ex.printStackTrace();
        //rollback
    } finally {

      //close Connection
    }
}