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