【问题标题】:Last insert id in diffrent table mySql最后在不同的表 mySql 中插入 id
【发布时间】:2021-03-07 16:54:07
【问题描述】:

我有 2 个如下表:

create TABLE person(
id INTEGER not NULL AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(255), 
surrname VARCHAR(255)
); 


create TABLE users(
id INTEGER not NULL AUTO_INCREMENT PRIMARY KEY, 
login VARCHAR(50), 
password VARCHAR(50),
person_id int references person(id)
);

我将插入添加到表“人”:

Insert into person(name,surrname) values ('mark','second');

现在我的问题开始了,因为当我尝试将插入添加到表“用户”时, 我必须将最后添加的 id 放在“person”表中。

Insert into users
        (login,password,person_id) 
values ('login123','pass123',>here must be last added id from person table<);`

在 oracle 数据库中,我会使用一个序列,但在这里不可能。有人可以知道应该有什么价值吗?

【问题讨论】:

  • 第一次插入后,在下一次插入时使用LAST_INSERT_ID()
  • 下一个插入应该是这样的?插入用户(登录名、密码、person_id)值('login123'、'pass123'、LAST_INSERT_ID());`
  • 假设查询使用相同的连接,一个接一个,并且第一次插入没有错误,是的。第二个查询的值部分可能是:...values ('login123','pass123', LAST_INSERT_ID());
  • 是的,它的工作原理,但我想以不同的方式做到这一点。我想添加第一个插入,在下一个连接中,下一个插入?有可能吗?
  • 有人可以帮我吗?因为我最终需要在 java 和 JDBC 中这样做,所以我不能在一个语句中进行两次插入,所以这是个大问题。

标签: mysql sql database insert sql-insert


【解决方案1】:

是的,它的工作原理,但我想以不同的方式做到这一点。我想添加第一个插入,在下一个连接中,下一个插入?有可能吗?

您确实需要在与第一个插入相同的连接中获取最后一个插入 ID。如果您在插入后立即执行此操作,则可以将其作为结果集返回,并将其保存在应用程序的变量中:

INSERT INTO person(name,surrname) VALUES ('mark','second');

SELECT LAST_INSERT_ID();

像处理任何其他返回值的 SELECT 语句一样处理后一个语句。将其保存在 Java 程序的变量中。

然后在后续的 INSERT 中使用该 Java 变量,将其绑定为参数化语句的值:

Insert into users
        (login,password,person_id) 
values ('login123','pass123',?);`

有很多关于将 Java 变量传递给参数化 SQL 语句的指南。例如:https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

【讨论】:

    【解决方案2】:

    https://mariadb.com/kb/en/insertreturning/

    这会让你返回 id

    Insert into person(name,surrname) values ('mark','second') returning id;
    

    【讨论】:

    • 请注意,语法至少需要 v10.5。
    • 哦,是的....标题也特别提到了 MySQL,所以这可能是不可接受的。我找不到实现该功能的 MySQL 参考。
    • 我确认 MySQL 至少 8.0 的任何版本都没有实现 RETURNING 子句。到目前为止,我们确实需要将 MariaDB 视为一个独特的产品,因为它自 2010 年分叉以来一直在添加自己的功能。
    猜你喜欢
    • 2012-05-31
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2010-12-13
    • 1970-01-01
    • 2011-06-01
    • 2017-10-14
    相关资源
    最近更新 更多