当前位置: 首页 > 面试题库 >

带有last_insert_id()的MySQL多行插入选择语句

白刚洁
2023-03-14
问题内容

好的。简而言之,我正在尝试执行INSERT SELECT,例如:

START TRANSACTION;  
INSERT INTO dbNEW.entity (commonName, surname)  
SELECT namefirst, namelast  
FROM dbOLD.user;  
SET @key = LAST_INSERT_ID();  
INSERT INTO dbNEW.user (userID, entityID, other)  
SELECT user_id, @key, other  
FROM dbOLD.user;  
COMMIT;

当然,@key不会从每个插入中返回每个后续的LAST_INSERT_ID(),而是仅从最后一个插入返回ID。

基本上,我将旧的USER表拆分为ENTITY和USER,例如:

 dbOLD.user
 +-------------+---------------------+------+-----+------------+----------------+
 | Field       | Type                | Null | Key | Default    | Extra          |
 +-------------+---------------------+------+-----+------------+----------------+
 | user_id     | int(10) unsigned    | NO   | PRI | NULL       | auto_increment |
 | namefirst   | varchar(20)         | NO   |     |            |                |
 | namelast    | varchar(20)         | NO   |     |            |                |
 | other       | varchar(10)         | NO   |     |            |                |
 +-------------+---------------------+------+-----+------------+----------------+


 dbNEW.user
 +-------------+---------------------+------+-----+------------+----------------+
 | Field       | Type                | Null | Key | Default    | Extra          |
 +-------------+---------------------+------+-----+------------+----------------+
 | userID      | int(10) unsigned    | NO   | PRI | NULL       | auto_increment |
 | entityID    | int(10) unsigned    | NO   | MUL | 0          |                |
 | other       | varchar(10)         | NO   |     |            |                |
 +-------------+---------------------+------+-----+------------+----------------+


 dbNEW.entity
 +--------------+---------------------+------+-----+------------+----------------+
 | Field        | Type                | Null | Key | Default    | Extra          |
 +--------------+---------------------+------+-----+------------+----------------+
 | entityID     | int(10) unsigned    | NO   | PRI | NULL       | auto_increment |
 | commonName   | varchar(20)         | NO   |     |            |                |
 | surname      | varchar(20)         | NO   |     |            |                |
 +--------------+---------------------+------+-----+------------+----------------+

我为什么要这样做?基本上,我有一个“商店”实体,它将具有“用户”公用的字段,例如地址和电话号码。因此,任何“
ENTITY”都可能没有多个地址(送货,帐单,邮寄),也没有多个电话号码(传真,主,帐单,手机,家),可能有其他方法可以做到这一点,但这是我的解决方案最后。

旧数据库中的商店和用户需要保留其旧PK,并获得额外的ENTITY fk。如何在不进行转储和手动编辑的情况下执行此操作?


问题答案:

对于最后一个查询,请使用此

INSERT INTO dbNEW.`user` (userID, entityID, other)  
SELECT user_id, entityID, other
FROM
(
    SELECT user_id, @key + @rn entityID, other, @rn := @rn + 1
    FROM (select @rn:=0) x, dbOLD.`user`
    order by user_id
) y;

MySQL中的LAST_INSERT_ID()是成批创建的第一个ID,与SQL Server中的SCOPE_IDENTITY()不同,后者是LAST
ID。由于它是第一行,因此我们使用变量@rn从addition=0第一行开始递增每一行。



 类似资料:
  • 我在MySQL中有下表。 表1(身份证、名字、姓氏、电话号码) 表2(TID、电子邮件) 我在 Table1 中有 25000 行,而我的 Table2 包含 20000 行。我在表 2 中的 TID 是引用表 1 的主键 ID 的外键。如果姓氏为 NULL,则 Table2 中将不存在这些 ID。现在,我正在尝试仅针对具有姓氏的表合并这两个表。 我重新定义了表2的模式,如下所示。 Table2(

  • 这是我的疑问- 我在执行时遇到这个错误 错误:您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获得使用“alter TABLE tmp drop category_id”附近的正确语法;在第2行插入类别SELECT 0'错误号:1064 但是当我直接在数据库中运行查询时,我不会得到任何错误。请帮帮我!

  • 问题内容: 我想知道是否可以运行这样的请求: 这个想法是用t1的一些数据填充t2,但是我在语法上一定是错误的。 谢谢你的帮助 问题答案: 从语句插入时不使用关键字。

  • 问题内容: 有没有办法插入预设值和我从选择查询中获得的值?例如: 我有“字符串”的值和数字5,但是我必须从这样的选择中找到[int]值: 那给我那个ID放在table1里面。 如何将其合并为一个语句? 问题答案: 使用查询,并将已知值放入:

  • 问题内容: 我正在尝试向表中插入其他行,该表要求从另一个表中检索一个值。以下是查询示例: 表的结构为。 我知道以上查询是错误的。有没有办法在插入行时从其他表中检索1个值? 问题答案: 一些DBMS会接受以下内容,并在SELECT语句的周围加上括号:

  • 问题内容: 昨天我问了这个问题:如果在mysql中插入语句并且答案很好用。问题是,如果值不存在,我需要在表中插入一行。FE 我能怎么做?在互联网上我找不到答案:( 问题答案: 我假设您的表名为tbl。 纯粹是为了方便那些要求所有SELECT语句都应该包含FROM以及可能包含其他子句的人们。MySQL可能会忽略这些子句。如果没有引用表,MySQL不需要FROM DUAL。 如其他提到的那样,如果您的