sql - 带有 last_insert_id() 的 Mysql 多行插入选择语句

标签 sql mysql lastinsertid

好的。所以简而言之,我正在尝试执行 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   |     |            |                |
 +--------------+---------------------+------+-----+------------+----------------+

我为什么要这样做?基本上,我有一个“STORE”实体,它将具有“USERS”共有的字段,例如地址和电话号码。所以任何“实体”可能没有多个地址(运输、账单、邮寄)和多个电话号码(传真、主要、账单、手机、家庭)可能有其他方法可以实现这一点,但这是我的解决方案结束了。

旧数据库中的 STORE 和 USERS 需要保留它们的旧 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() 是最后一个 id。由于它是第一行,我们使用变量 @rn 递增每一行,从第一行的 addition=0 开始。

关于sql - 带有 last_insert_id() 的 Mysql 多行插入选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6251714/

相关文章:

mysql - 为每个唯一列值选择不禁止用户的最短时间

mysql - 如何在MYSQL中选择包含所有字母和数字的行?

python - 使用python进行Nmap扫描并存储在mysql中

mysql - 选择最后一个 id,没有 INSERT

mysql - “Where IN” 是否在标准 SQL 中定义了多个列?

sql - 提取日/小时/分钟

MySQL 事件未触发

MySQL:根据事件类型计算事件出席率

MySQL假设基于多值插入和第一个id自动递增ID

sql-server - 使用 select 的 SQL 插入可以返回多个身份吗?