[英]convert table from one to many into many to many MYSQL
我有一个表,该表过去使用 parent_id 列具有一对一的关系,我们的逻辑发生了变化,我们需要启用多对多,所以我们 - 不幸的是 - 没有奢侈地更改数据库模型,所以我们曾经插入多行每个关系一个,并在代码中将它们分组。
现在我需要重组 mysql 表以反映多对多关系。
例子
Table Blog
ID, Body, target_id, grouping
1 etc 1 1
2 etc 2 1
3 etc2 1 3
4 etc2 2 3
目前,每当我们创建新的博客文章时。 我们插入第一行。 抓住它的 id,并为每个目标复制插入。
所以现在随着 db 变得更大。 我们需要停止这种情况并创建一个保存关系的中间表。 所以上表会变成
Table Blog
ID, Body
1 etc
3 etc2
Table Blog_target
blog_id,target_id
1 , 1
1 , 2
3 , 1
3 , 2
那么如何在不丢失mysql中任何数据的情况下将旧表中的数据拆分为新表?
像这样的东西? new_blog 表,因为您的 blog 表已经存在,在您完成并对 new_blog 表和 blog_target 表中的数据感到满意后,您可以删除您的 blog 表并RENAME TABLE new_blog TO blog;
INSERT INTO new_blog(ID, Body)
SELECT DISTINCT grouping, body FROM blog;
INSERT INTO blog_target(blog_id,target_id)
SELECT grouping,target_id
FROM blog;
我不知道这是否会对您的情况有所帮助,但我必须将oneToMany表关系更改为manyToMany表,下面是我如何实现这一点。
一种简单的方法是使用以下命令删除该列的唯一约束:
ALTER TABLE relation_table DROP INDEX UK_constraint_id;
如果您安装了 MySql Workbench,那就更容易了,因为您不需要发现约束 id。 只需选择您的表 -> 更改表并取消选中该列的 UQ 复选框,然后单击“应用”。
如果您没有安装 MySql Workbench,您可以执行以下查询以找出约束 id:
USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<schema_name>"
AND TABLE_NAME = "<table_name>";
并且只需使用上面提到的 ALTER TABLE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.