代码之家  ›  专栏  ›  技术社区  ›  fmalina

从sti-sql转移到新的多表结构中

  •  0
  • fmalina  · 技术社区  · 16 年前

    我正在将使用单表继承的旧项目移到更结构化的新数据库中。我如何编写一个SQL脚本来移植这个?

    旧结构

    为了易读性,我简化了SQL。

    CREATE TABLE customers (
      id int(11),
      ...
      firstName varchar(50),
      surname varchar(50),
    
      address1 varchar(50),
      address2 varchar(50),
      town varchar(50),
      county varchar(50),
      postcode varchar(50),
      country varchar(50),
    
      delAddress1 varchar(50),
      delAddress2 varchar(50),
      delTown varchar(50),
      delCounty varchar(50),
      delPostcode varchar(50),
      delCountry varchar(50),
    
      tel varchar(50),
      mobile varchar(50),
      workTel varchar(50),
    );
    

    新结构

    CREATE TABLE users (
      id int(11),
      firstName varchar(50),
      surname varchar(50),
      ...
    );
    
    CREATE TABLE addresses (
      id int(11),
    
      ForeignKey(user),
      street1 varchar(50),
      street2 varchar(50),
      town varchar(50),
      county varchar(50),
      postcode varchar(50),
      country varchar(50),
      type ...,
    );
    
    CREATE TABLE phone_numbers (
      id int(11),
      ForeignKey(user),
      number varchar(50),
      type ...,
    );
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Jonathan Leffler    16 年前

    如果合适,为表引用使用适当的跨数据库标记:

    INSERT INTO Users(id, firstname, surname, ...)
        SELECT id, firstname, surname, ...
            FROM Customers;
    INSERT INTO Addresses(id, street1, street2, ...)
        SELECT id, street1, street2, ...
            FROM Customers;
    INSERT INTO Phone_Numbers(id, number, type, ...)
        SELECT id, phone, type, ...
            FROM Customers;
    

    如果您同时需要新地址和旧地址(del*版本),那么在两组带有适当标记的源列上重复地址操作。同样,对于三个电话号码,重复电话号码操作。或者在每种情况下使用联合。

        2
  •  1
  •   HLGEM    16 年前

    首先确保备份现有数据!

    如果要使用原始ID字段或生成新的ID字段,则过程会有所不同。

    假设您要使用original,请确保您能够在启动前将ID字段插入表中(如果您正在自动生成该数字,则SQL Server等效项设置为identity insert on,不确定MySQL将使用什么)。从旧表插入父表:

    insert newparenttable (idfield, field1, field2) 
    select idfield, field1, field2 from old parent table
    

    然后根据需要的字段为所有子表编写类似的插入。例如,如果在不同的字段中有多个电话号码,您将使用UnionAllStament作为插入选择。

    Insert newphone (phonenumber, userid, phonetype)
    select home_phone, id, 100 from oldparenttable
    union all
    select work_phone, id, 101 from oldparenttable
    Union all
    select cell_phone, id, 102 from oldparenttable
    

    如果您要生成一个新的ID,那么就用一个旧ID的字段创建表。您可以在末尾删除它(尽管我会将它保留大约六个月)。然后,可以从新父表联接到旧ID上的旧父表,并在插入到子表时从新父表中获取新ID。类似:

    Insert newphone (phonenumber, userid, phonetype)
    select home_phone, n.id, 100 from oldparenttable o
        join newparenttable n on n.oldid = o.id
    union all
    select work_phone, n.id, 101 fromoldparenttable o
        join newparenttable n on n.oldid = o.id
    Union all
    select cell_phone, n.id, 102 from oldparenttable o
        join newparenttable n on n.oldid = o.id