Mysql
將外鍵作為列添加到表中
我有兩個表如下:
表名:table_1
我正在重構這個表,因為它有一些缺陷和冗餘數據。此外,此表中提到的日期為 VARCAR(20)。
我想將其重構為 2 個表,如下所示:
表A–每個學生ID只有1個條目,在表中輸入的第一個日期,學生的最新註冊狀態和家長姓名(將table_1中的條目加粗)
表名:table_2
表 B – 其餘歷史數據
表名:table_3
“table_2”表中的“ID”列是主鍵。“table_3”表中的“studentId_1”列是一個外鍵。
我知道如何創建 table_2。
INSERT IGNORE INTO table_2 (studentId, `start_date`, `status`, `parent name`) SELECT studentId, MIN(`Date`), MIN(enrolled), `parent name` FROM table_1 GROUP BY studentId, `parent name`; SELECT * FROM table_2;
這給出了一個輸出:
如何創建 table_3,因為它在下表中具有“FOREIGN KEY”,如下所示:
- MIN(enrolled) 很笨拙。它僅因字元串選擇和比較而起作用。
- 漏洞! 不能信任
MIN(
Date從同一行獲取數據。), MIN(enrolled)
你有一個“groupwise-max”問題;看標籤。- 你需要索引;FK 是可選的。
ID
在 table_3 上是不必要的;PK可以PRIMARY KEY(student_id, date)
- 做用
DATETIME
,不用VARCHAR
。- Table_2 不需要
ID
;PRIMARY KEY(student_id)
真的是你需要的。由於您似乎是從 建構
students
(table_2
) 和income_history
(table_3
)table_1
,因此這兩個步驟可能有效:INSERT INTO students (...) SELECT ... FROM table_1 WHERE enrolled = 'enrolled'; INSERT INTO income_history (...) SELECT ... FROM table_1;
(如果有更多選擇,
enrolled
或者學生可以“註冊”兩次或……,那麼上述方法將不起作用。)
CREATE TABLE table_1 ( ID INT, studentId INT, `Date` DATETIME, enrolled VARCHAR(255), `parent name` VARCHAR(255), `parents annual income` INT ); INSERT INTO table_1 VALUES (1, 12345, '2022/01/13 14:39:15', 'enrolled', 'ABC', 12345), (2, 12345, '2022/01/13 14:39:06', 'not-enrolled', 'ABC', 10345), (3, 12345, '2022/01/13 8:03:44', 'not-enrolled', 'ABC', 1467), (4, 67890, '2022/01/12 14:39:15', 'enrolled', 'DEF', 12345), (5, 67890, '2022/01/14 14:39:06', 'not-enrolled', 'DEF', 10345), (6, 67890, '2022/01/14 8:03:44', 'not-enrolled', 'DEF', 1467); SELECT * FROM table_1;
CREATE TABLE table_2 ( ID INT AUTO_INCREMENT, studentId INT, `start_date` DATETIME, `status` VARCHAR(255), `parent name` VARCHAR(255), PRIMARY KEY (ID), UNIQUE (studentId) ); CREATE TABLE table_3 ( ID INT AUTO_INCREMENT, studentId_Id INT, `Date` DATETIME, enrolled VARCHAR(255), `parents annual income` INT, PRIMARY KEY (ID), CONSTRAINT fk_studentId_Id FOREIGN KEY (studentId_Id) REFERENCES table_2 (ID) ON DELETE CASCADE ON UPDATE CASCADE );
要將數據從 table_1 插入 table_2:
INSERT IGNORE INTO table_2 (studentId, `start_date`, `status`, `parent name`) SELECT studentId, MIN(`Date`), MIN(enrolled), `parent name` FROM table_1 GROUP BY studentId, `parent name`; SELECT * FROM table_2;
要將與 table_2 相關的 table_1 中的數據插入 table_3:
INSERT INTO table_3 ( studentId_Id, `Date`, enrolled, `parents annual income`) SELECT t1.ID, t2.`Date`, t2.enrolled, t2.`parents annual income` FROM table_2 AS t1, table_1 as t2 WHERE t1.studentId = t2.studentId; SELECT * FROM table_3;