在上次查询中获取插入的记录/获取更改的行数(MySQL)

时间:2019-03-15 10:11:58

标签: php mysql sql-insert database-migration

我目前正在将旧的数据库结构迁移到新的数据库结构。我正在创建一个SQL脚本(因为我可能需要多次执行此操作),并且遇到了我想做的特定操作。

因此,此脚本的相关表/字段:

  

状态->旧表,我将在其中获取标签记录

  • id
  • 默认名称
  • 颜色代码
  • 状态

  

自由职业者->旧桌子

  • idfreelancer
  • (自由职业者信息,很多不重要的字段)
  • idstate

  

标签->新表格,用于存储标签(自由职业者可以具有多个标签,标签可以具有多个自由职业者)

  • idlabel
  • 名称
  • 颜色代码
  • idcreator

  

free_labels ->新表格,以交叉引用标签和自由职业者

  • idlabel
  • idfreelancer

所以,我想要什么:

  1. 将每个记录从default_name IS NULL的州复制到标签。
  2. 删除default_name IS NULL州的所有记录
  3. 如果自由职业者的状态为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))

注意::我还没有尝试过该查询,所以我什至不知道我能否用双INSERT INTO做一个SELECT

并在从州删除记录之前使用此查询。 但是,此查询对我有2个问题。

  • 它不会改变自由职业者的状态,
  • 最重要的是,它会“中断”多个记录,因为LAST_INSERT_ID()只会为我提供最后插入的记录。

我对如何执行此操作有些迷惑,我认为可以通过从查询中获取更改记录的数量来完成,但是我不知道是否可以通过SQL来实现(我也可以使用PHP不过,如果需要的话,我宁愿不这样做。

我考虑过的另一件事是,也许我可以对INSERT进行JOIN,所以我将记录同时插入labelsfree_labels中时间。但是再次,我不知道SQL是否可以解决这个问题,甚至可以解决我的问题。

我真的想避免手动迁移此记录...

任何帮助/建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

首先,您需要再创建一列新标签表:

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;

您现在可以将freelancer 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;