【问题标题】:MySQL Create Tables Based On Values From A Different TableMySQL 根据来自不同表的值创建表
【发布时间】:2018-05-11 02:47:59
【问题描述】:

根据另一个表中的值自动创建新表的正确方法是什么?例如,如果表 A 有一个名为 city 的列,其中包含不同的城市值,那么我需要根据每个不同的城市创建一个新表。然后需要将具有相应城市的所有记录插入到相应的表中。此外,如果城市名称中包含空格,则需要将其替换为下划线。在 MySQL 中怎么能做到这一点?

在 MS ACCESS 中,我可以通过以下方式完成此操作:

  1. 使用名为 SELREP 的选择和替换查询

    SELECT table_A.column1, table_A.column2, table_A.city, Replace([city]," ","_") AS table_name_column FROM table_A;
    
  2. 创建一个公共函数 MakeTableCity

    Public Function MakeTableCity()
    DoCmd.SetWarnings False
    Dim db As Database
    Set db = Application.CurrentDb
    Dim distinctValues As DAO.Recordset
    Set distinctValues = db.OpenRecordset("SELECT table_name_column FROM SELREP GROUP BY table_name_column", dbOpenSnapshot)
    Do Until distinctValues.EOF
    DoCmd.RunSQL "SELECT * INTO " & distinctValues("table_name_column") & " FROM SELREP WHERE table_name_column ='" & distinctValues("table_name_column") & "'"
    distinctValues.MoveNext
    Loop
    DoCmd.SetWarnings True
    Set distinctValues = Nothing
    Set db = Nothing
    End Function
    

【问题讨论】:

  • 为什么每个城市都需要一个单独的表格? MySQL 旨在处理将多个城市的数据放在一个表中。
  • 确实,拥有多个结构相同的表是糟糕设计的强烈标志。它也是一种非规范化形式。
  • 因此特定城市的用户可以轻松导航到他们自己的城市数据。
  • 虽然你可以按城市分区,但你很可能会有相当不平衡的分区。 (例如,俄勒冈州波特兰的数据很可能比纽约州纽约少)
  • 只需使用 WHERE 子句按城市名称过滤结果

标签: php mysql database


【解决方案1】:
  • 如果您打算创建一个新的 带有城市数据的表格城市, 意思是每个城市一排,那么 继续阅读答案。

  • 另一方面,如果您是 计划为 每个城市,都有相同的柱子, 那么你的计划是非常糟糕的设计。 首先阅读规范化。


第一个替代方法是创建一个名为city 的表,其中包含您想要的字段。示例:

CREATE TABLE city
( id INT auto_increment PRIMARY KEY
, name VARCHAR(50) NOT NULL
, population INT
, state CHAR(2)
) ;

然后将不同的城市名称复制到其中:

INSERT INTO city (name)
  ( SELECT DINSTINCT city     --- change "city" into REPLACE(city, ' ', '_')
    FROM table_A              --- for the small changes you want 
  ) ; 

然后,更新其他字段(人口、州等)。

如果没有两个城市的名称相同,则两个表之间的JOINs 可以使用ON table_A.city = city.name 完成

如果不是,(无论如何cityPrimary Key 会更小更好),您可以通过添加字段cityid 并删除city 字段来ALTER table table_A 的结构。然后两个表之间的JOINs 将使用ON table_A.cityid = city.id 完成


第二个选项是直接创建表城市:

CREATE TABLE city AS
  ( SELECT DINSTINCT city AS name  --- change "city" into REPLACE(city, ' ', '_')
    FROM table_A                   --- for the small changes you want 
  ) ; 

然后更改定义主键的表,添加(人口、状态等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多