【问题标题】:mysql split data from one table into two tables with mapping(association) preservedmysql将数据从一个表拆分为两个表,并保留映射(关联)
【发布时间】:2013-07-28 19:59:38
【问题描述】:

假设我有一个名为“学生”的表格,其中包含姓名、手机、电子邮件、首选课程、首选学校、性别、年龄、地址、资格、职务、家庭电话、工作电话

我想从学生表中选择数据并插入到 2 个表中,例如, 查询 =>(带列)ID、姓名、手机、电子邮件 Enrollments =>(带列)Id、inquiry_id、姓名、手机、电子邮件、首选课程、首选学校、性别、年龄、地址、资格、职务、家庭电话、工作电话

如何使用查询表中的正确 id 值填充注册表中的inquiry_id?

【问题讨论】:

    标签: mysql insert associations primary-key


    【解决方案1】:

    使用LAST_INSERT_ID()获取最后插入查询的id;

    INSERT INTO inquiries (name, mobile, ...
    
    INSERT INTO enrollments (inquiry_id, name, ...) 
       VALUES (LAST_INSERT_ID(), 'myname', ...
    

    A simple SQLfiddle for testing.

    批量移动的另一种方法是添加一个临时列来保存旧 id,以便您可以使用正确的列进行第二次插入;

    ALTER TABLE inquiries ADD COLUMN oldid INT;
    
    INSERT INTO inquiries (..., oldid) SELECT ..., id FROM students;
    INSERT INTO enrollments (inquiry_id, ...)
      SELECT (SELECT id FROM inquiries WHERE students.id=oldid), ...
      FROM students;
    
    ALTER TABLE inquiries DROP COLUMN oldid;
    

    Another SQLfiddle.

    【讨论】:

    • @beck03076 添加了一个带有示例的 SQLfiddle。
    • 不...听着..我在学生表中有 10000 行,我要运行 INSERT INTO 查询 SELECT null,null,fname,lname,null,concat(email,", ",email2 ),null,phone,null,mobile,null,null,now(),null FROM Students;如何解决?
    • 我希望查询 id 从此查询表映射到登记表。
    • 我是否应该编写一个存储过程,为学生表创建一个游标,并为每条记录插入查询,然后使用 last_insert_id() 插入注册..????
    • @beck03076 最简单的可能是做一个逐行执行的存储过程,另一种可能是临时添加一个列'oldid'到查询映射,并执行INSERT INTO inquiries SELECT null,null,fname,lname,null,concat(email,", ",email2),null,phone,null,mobile,null,null,now(),null,id FROM Students之类的操作,和INSERT INTO enrollments (inquiry_id, name, ...) SELECT ((SELECT a.id FROM inquiries a WHERE a.oldid=students.id), 'myname', ...) FROM Students,然后删除 temp 列。
    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多