我目前正在将旧的数据库结构迁移到新的数据库结构。我正在创建一个SQL脚本(因为我可能需要多次执行此操作),并且遇到了我想做的特定操作。
因此,此脚本的相关表/字段:
状态->旧表,我将在其中获取标签记录
自由职业者->旧桌子
标签->新表格,用于存储标签(自由职业者可以具有多个标签,标签可以具有多个自由职业者)
free_labels ->新表格,以交叉引用标签和自由职业者
所以,我想要什么:
default_name IS NULL
的州复制到标签。default_name IS NULL
州的所有记录对于前两点,我提出了查询:
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
,所以我将记录同时插入labels
和free_labels
中时间。但是再次,我不知道SQL是否可以解决这个问题,甚至可以解决我的问题。
我真的想避免手动迁移此记录...
任何帮助/建议将不胜感激!
答案 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;