簡體   English   中英

MySQL 根據來自不同表的值創建表

[英]MySQL Create Tables Based On Values From A Different Table

根據另一個表中的值自動創建新表的正確方法是什么? 例如,如果表 A 有一個名為 city 的列,其中包含不同的城市值,那么我需要根據每個不同的城市創建一個新表。 然后需要將具有相應城市的所有記錄插入到相應的表中。 此外,如果城市名稱中包含空格,則需要將其替換為下划線。 在 MySQL 中怎么能做到這一點?

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

  1. 使用 Select 並替換名為 SELREP 的查詢

    SELECT table_A.column1, table_A.column2, table_A.city, Replace([city]," ","_") AS table_name_column FROM table_A;
  2. 創建公共 Function 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
  • 如果您計划使用有關城市的數據創建一個新表 city,這意味着每個城市一行,然后 go 前面並閱讀答案。

  • 另一方面,如果您計划為每個城市制作一個具有相同列的新表,那么您的計划是非常糟糕的設計。 首先閱讀規范化。


第一種選擇是創建一個名為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 
  ) ; 

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

如果沒有兩個城市具有相同的名稱,則可以使用ON table_A.city = city.name來完成兩個表之間的JOIN

如果沒有,(最好是因為cityPrimary Key會更小),您可以通過添加字段cityid並刪除city字段來更改table table_A ALTER結構。 然后兩個表之間的JOIN將使用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 
  ) ; 

然后更改定義主鍵的表,添加(人口、state 等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM