Mysql

將外鍵作為列添加到表中

  • January 25, 2022

我有兩個表如下:

表名: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 不需要IDPRIMARY 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;

引用自:https://dba.stackexchange.com/questions/306485