我目前正在将旧的数据库结构迁移到新的数据库结构。我正在创建一个 SQL 脚本(因为我可能需要多次执行此操作)并且我卡在了我想执行的某个操作上。
所以这个脚本的相关表/字段:
states -> old table, where I'm gonna get the records for labels
- 编号
- 默认名称
- 颜色代码
- 状态
freelancers -> old table
- 自由职业者
- (自由职业者信息,很多不重要的字段)
- 状态
labels -> new table, to store labels (freelancers can have several labels, labels can have several freelancers)
- 标识标签
- 姓名
- 颜色代码
- 创意者
free_labels -> new table, to cross reference labels and freelancers
- 标识标签
- 自由职业者
所以,我想要的是:
- 将
default_name IS NULL
状态下的每条记录复制到标签中。 - 从
default_name IS NULL
的状态中删除每条记录 - 如果自由职业者的状态的 default_name 为 NULL,则应将其更改为 idstate=1 并在 free_labels 表中插入相应的标签。
对于前两点,我提出了查询:
INSERT INTO labels(name,color_code,idcreator)
SELECT state AS name,color_code,2 AS idcreator FROM states
where default_name IS NULL;
DELETE FROM states WHERE default_name IS NULL;
我已将 idcreator 强制设置为 2,这是有意为之的,我知道这可能看起来很奇怪。
对于第三点,我想使用类似的东西:
INSERT INTO free_labels(idlabel,idfreelancer)
VALUES
((SELECT LAST_INSERT_ID() FROM labels),
(SELECT f.idfreelancer FROM freelancers f, states s,
WHERE f.idstate=s.id AND s.default_name IS NULL))
注意:我还没有尝试过这个查询,所以我什至不知道我是否可以用双 SELECT 执行
。INSERT INTO
并在从状态中删除记录之前使用此查询。 但是这个查询对我来说有 2 个问题。
- 它不会改变自由职业者的状态,
- 而且,最重要的是,它会“中断”多个记录,因为
LAST_INSERT_ID()
只会让我得到最后插入的记录。
我对如何执行此操作有点迷茫,我认为这可以通过从查询中获取已更改记录的数量来完成,但我不知道是否可以通过 SQL(我也可以使用 PHP不过,如果需要的话,我宁愿不要)。
我考虑过的另一件事是,也许我可以用 JOIN
执行 INSERT
,所以我会在 labels
中插入记录和 free_labels
同时。但同样,我不知道 SQL 是否可行,是否能解决我的问题。
我真的很想避免手动迁移这些记录...
如有任何帮助/建议,我们将不胜感激!
最佳答案
因此,首先您要创建多一列的新标签表:
CREATE TABLE labels (
idlabel int PRIMARY KEY AUTO-INCREMENT,
#Some other columns....
old_id int
);
然后像往常一样将数据插入到该表中加上 old_id(并删除行):
INSERT INTO labels(name,color_code,idcreator,old_id)
SELECT state AS name,color_code,2 AS idcreator, id AS old_id FROM states
where default_name IS NULL;
DELETE FROM states WHERE default_name IS NULL;
您现在可以将您的自由职业者 ID 映射到 free_labels 表中的旧 stateid :
INSERT INTO free_labels (idlabels, idfreelancers)
SELECT labels.idlabel, freelancers.idfreelancer
FROM labels
JOIN freelancers
ON labels.old_id = freelancers.idstate;
现在您需要做的就是将自由职业者的 idstate 设置为 1(注意不要有 id=1 的状态,或者据说要检查 free_labels,否则将其设置为 NULL 或 0),删除列在标签中,仅此而已:
UPDATE freelancers SET idstate = 1 WHERE idfreelancer IN (SELECT idfreelancer FROM free_labels);
ALTER TABLE labels DROP COLUMN old_id;
关于php - 获取上次查询中插入的记录/获取更改的行数(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55180209/