sql - 摆脱 STI - SQL 将单个表分解为新的多表结构

标签 sql mysql database database-design foreign-keys

我正在将使用单表继承的旧项目移动到一个更加结构化的新数据库中。我该如何编写 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 ...,
);

最佳答案

如果适用的话,使用适当的跨数据库符号进行表引用:

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* 版本),请使用适当的标记对两组源列重复地址操作。同样,对于三个电话号码,重复电话号码操作。或者在每种情况下使用 UNION。

关于sql - 摆脱 STI - SQL 将单个表分解为新的多表结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911703/

相关文章:

sql - 带有 "or"运算符的 DB2 SQL 正则表达式

php - 如何将 'And' 子句放入多对多

mysql - 如何在共享帖子数据时将 wp_options 与两个 WordPress 分开

php - 在 SQL 查询或 PHP 中进行计算?

mysql - 如何更改数据库中的数据类型

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

sql - Presto/SQL - 将字符串时间戳转换为日期会引发错误

database - 打开没有游标的记录集

php - 如何使用php函数对特殊字符进行编码

c# - 在执行更多查询时,我得到了 "Not allowed to change the ' ConnectionString' 属性。”