Java 使用自动递增列作为主键插入数据
我有两个表,其中主键(另一个表上的外键)在运行时自动递增(使用TOAD for mysql)。 如何使用事务将数据同时插入两个表中 这是第一个表的ddl:Java 使用自动递增列作为主键插入数据,java,sql,foreign-keys,auto-increment,foreign-key-relationship,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` varcha
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;
注意:主要的挑战是从主键上获取自动递增的键值,以便在运行时插入到另一个表中
非常感谢。如果您的数据库是MySql数据库,您可以使用以下函数在第一个表中插入一条记录
SELECT LAST_INSERT_ID();
获取最后一个插入的id,您可以在第二次插入时使用它。仅在第二次插入后提交全部如果您的数据库是MySql数据库,则可以使用以下函数在第一个表中插入记录
SELECT LAST_INSERT_ID();
获取最后一个插入的id,您可以在第二次插入时使用它。仅在第二次插入后提交所有内容如何:
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
}
}
这个怎么样:
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
}
}
我会说你先关闭蟾蜍的自动提交。我会说你先关闭蟾蜍的自动提交。这似乎是一个很好的代码。你能用mysql数据库和准备好的语句重现这个吗?这似乎是一个很好的代码。你能用mysql数据库和准备好的语句重现这个问题吗?有时候一个简单的答案就是正确的答案。我最初没有考虑你的答案,浪费了很多时间来调整以前的代码。非常感谢。你刚刚救了我。注意:对于任何面临同样挑战的人,只需在准备好的语句中使用最后一个插入Id作为您的值。有时简单的答案就是正确的答案。我最初没有考虑你的答案,浪费了很多时间来调整以前的代码。非常感谢。你刚刚救了我。注意:对于任何面临同样挑战的人,只需在准备好的语句中使用最后一个插入Id作为您的值。