根据主键插入外键到表中

时间:2021-03-02 08:03:20

标签: mysql sql foreign-keys

我试图将一个表拆分为两个表,并想将一个表的引用(外键)添加到另一个表中

例如,假设有一个名为 customer 表的表,其中一个名为 Group Name 的列具有不利于数据规范化的重复数据,因此我想拆分该列上的表,这将替换该组带有 GroupID 列的名称列

现在形成一个具有 2 列 GroupID 和 Group Name 的新表,并将不同的 Group 值插入到 GroupName 列中,并使用自动递增的 GroupID 作为组表中的主键,并在 Customer 表中引用以充当外键

现在的主要问题是如何将'GROUP TABLE'的那些Autoincremented GroupID插入客户表的groupID或如何根据主表将外键插入客户表

enter image description here

customerTable With GroupID 和 customerTable With Customer_Group 是两个不同的表

UPDATE ch03.customerd 
JOIN ch03.group gr ON customer.Customer_Group = gr.Group_Name 
SET customerd.Group_ID = gr.Group_id
WHERE customerd.Customer_id = customer.Customer_id;

update ch03.customerd set Group_ID =
(select gr.Group_id
from ch03.customer as co
join ch03.group as gr on co.Customer_Group = gr.Group_Name)
where customerd.Customer_id = customer.Customer_id;

这是我尝试过的,但没有用

1 个答案:

答案 0 :(得分:0)

如果除 group_id 之外的所有数据都已传输,则

UPDATE new_customer_table nc
  JOIN old_customer_table oc ON nc.customer_id = oc.customer_id
  JOIN new_group_table ng ON oc.customer_group = ng.group_name
SET nc.group_id = ng.group_id

如果新表是空的,那么

INSERT INTO new_group_table (group_name)
SELECT DISTINCT customer_group 
FROM old_customer_table;

INSERT INTO new_customer_table (customer_id, .. , customer_age, group_id)
SELECT oc.customer_id, .. , oc.customer_age, ng.group_id
FROM old_customer_table oc
JOIN new_group_table ng ON oc.customer_group = ng.group_name;

附注。如果旧表中的 customer_group 未定义为 ENUM / 没有检查输入值的有效性的 CHECK 约束,那么我建议先执行 INSERT INTO new_group_table .. 并仔细检查插入的值。如果发现一些印刷错误,那么您需要先编辑源数据,然后截断 new_group_table 并重复 - 直到所有组名都正确。