2017-10-05 13 views
1

大きなテーブルがあり、構造を変更する必要があります。あるカラムを別のテーブルに移動し、そのカラムを外部IDで更新する

ここはテーブルの構造です。

テーブル名: "関連記事"

+---------+---------------+-------------------+--------------+ 
| id(int) | details(text) | category(varchar) | tag(varchar) | 
+---------+---------------+-------------------+--------------+ 

重要事項:

  • 周り10Kのユニークなカテゴリ
  • があり
  • この表で250K(25万)行の周りにあります。

私は変更が必要

私は "カテゴリ"と呼ばれるテーブルを作成し、そのテーブルの外部キーとしてカテゴリの列を作成します。

これは私が期待するものである:私はカテゴリテーブルにカテゴリ名を移動する必要があり、その後、カテゴリIDと記事のテーブルを更新する必要が

テーブル名: "関連記事"

+---------+---------------+-------------------+--------------+ 
| id(int) | details(text) | category(int)  | tag(varchar) | 
+---------+---------------+-------------------+--------------+ 

テーブル名: "カテゴリー"

+---------+-------------------+ 
| id(int) | category(varchar) | 
+---------+-------------------+ 

だけでMySQLを使用して行うことが可能ですか? (私はいくつかのPHPスクリプトとMySQLコマンドを使ってそれを行う方法を知っています)。しかし私はここで尋ねました。なぜなら、MySQLだけで済ませれば、時間を大幅に節約できるからです。

答えて

1

(それはAUTO_INCREMENTカラムである)category(id)列が自動的に入力されていることをAssumming:

SET FOREIGN_KEY_CHECKS=0; 

INSERT INTO Category(category) 
SELECT DISTINCT category(varchar) 
FROM Articles; 

UPDATE Articles a, Category c 
SET a.category(int) = c.id 
WHERE a.category(varchar) = c.category 
; 

SET FOREIGN_KEY_CHECKS=1; 

Iが同じテーブル内の他の(VARCHAR)categoryから1(INT)categoryカラムを区別するcategory(varchar)category(int)を使用します。これはもちろん構文的には間違っていますが、代わりに適切で明確な列名を使用する必要がありますcategory(xxx)

+0

ありがとうございました。あなたは私の約1-2時間の時間を節約します。もう一度ありがとう。 – Sasa1234

関連する問題