簡體   English   中英

將表從一對多轉換為多對多MYSQL

[英]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;

sqlfiddle

我不知道這是否會對您的情況有所幫助,但我必須將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.

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