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

标签 php mysql sql-insert database-migration

我目前正在将旧的数据库结构迁移到新的数据库结构。我正在创建一个 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

  • 标识标签
  • 自由职业者

所以,我想要的是:

  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))

注意:我还没有尝试过这个查询,所以我什至不知道我是否可以用双 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/

相关文章:

带有自动插入的 SQL 更新

mysql - 将参数传递给 mySQL 数据库的 IdbCommand

javascript - 如何将html网页截屏并作为图像发送到邮件

php - 替换多个 "-"PHP

MySQL 多表 SELECT 查询

php - 最后从 MySQL PHP 插入相应的记录 ID

php - Guzzle POST 请求不起作用

php - 将空白行插入表中以生成外键或更好的方法?

mysql - 需要从具有公共(public)日期字段的 2 个表中选择所有行

mysql - 获取列名作为变量的mysql列的值