当前位置: 首页 > 知识库问答 >
问题:

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

洪高阳
2023-03-14

我有两个表,其中主键(另一个表上的外键)在运行时自动递增(使用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;

注意:主要的挑战是从主键上获取自动递增的键值,以便在运行时插入到另一个表中。

提前谢谢。

共有2个答案

芮化
2023-03-14

这个怎么样:

 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
    }
}
魏英勋
2023-03-14

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

SELECT LAST_INSERT_ID();

以获取最后插入的id,并且可以在第二个插入中使用它。只在第二次插入后提交全部

 类似资料:
  • 问题内容: 我创建了一个具有主键的表并启用了该表,如何使用MYSQL ? 这是我使用的查询,我尝试使用“”和“ 1”作为第一个值,但是它不起作用。 问题答案: 为了利用列的自动递增功能,在插入行时不要为该列提供值。数据库将为您提供一个值。

  • 问题内容: 我正在尝试添加具有自动增量的主键。 我已经阅读了一些文档和其他问题-有和声明,但是不起作用。 这是我做的: 和 我怎么了 我只想将主键增加1。 问题答案: 是或多或少是一种列类型,所以说就像说,只是说: 如果您想自己创建序列,那么您想将序列中下一个值的默认值设为默认值,这意味着: 为了模拟通常的行为,您还需要使表拥有该序列: 阅读手册的“串行类型”部分可能会很有成果。 我还建议您不要对

  • 问题内容: 这可能在MySql中吗?我可以有一个以字母为前缀的自动递增主键,例如R1234,R1235,R1236 …等等吗? 问题答案: 您可以做的是将密钥存储为两列。一个char前缀和一个auto-incrementing int,它们都被分组为主键。

  • 我将向一个SQL Server表中添加一行,该表的主键列是自动递增的(< code>identity)。当我以编程方式向表中插入一个新行时,有没有办法获得所添加行的键值,因为我想在另一个相关表中将它用作外键?

  • 问题内容: 我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否有可能自动将数据插入主键列(我已经在数据库中有500行,并希望为其提供ID,但我不想手动执行) 。有什么想法吗?非常感谢。 问题答案: 在我的测试中,添加列的语句可以正常工作: 在为测试目的而创建的临时表上,以上语句创建了该 列,并为该表中的每个现有行插入了自动递增值,从1开始。

  • 正如标题所描述的,我试图利用phinx进行数据库迁移,但我有一个自动增量列,它并没有用作主键。据我所知,菲尼克斯是做不到这一点的。 我意识到,我可能完全没有那个列,但它是巨大的遗留代码的一部分,至少目前,我没有时间重构整个应用程序,以确保该列不会在任何地方使用。如果我的结论是正确的,而phinx无法实现这一点,我希望有一些替代方案,拥有所描述的功能