2016-07-26 4 views
-1

正規化されていないテーブルがあります。私はそれを正規化し、参照を作成する間に複数のテーブルにデータを素早く分離したい。すべてはストアドプロシージャで行われる。正規化されていない既存のデータを使用して複数の新しいテーブルを正規化して作成するためのストアドプロシージャ

表:


Murder

CaseIDGunManufacturerGunNameVillian

いくつかのサンプルデータ:

(40465893, 'BIG COMPANY','AK47', 'Dank Hank') 

(34534566, 'SMALL COMPANY','Bazooka', 'King Kong') 

ここでは、作成したいテーブルとその情報を個別にプッシュします。 これらのテーブル(制約付き)はすでに作成されており、データのみを追加する必要があることに注意してください。

`Villian` 
(

    `VillianId`, `VillianName`, 

    PRIMARY KEY (`VillianId`) 

) ; 

`Manufacturer` 
(

    `ManufacturerId`, `ManufacturerName`, 

    PRIMARY KEY (`ManufacturerId`) 

) ; 



`Gun` 
(
    `GunId`,`ManufacturerId`,`GunName`, 

    PRIMARY KEY (`GunId`), 

    FOREIGN KEY (`ManufacturerId`) REFERENCES `Manufacturer` (`ManufacturerId`) 

) ; 
`Event` 
(

    `VillianId`, `GunId`, `date`, 

    PRIMARY KEY (`VillianId`) 

    FOREIGN KEY (`VillianId`) REFERENCES `Villian` (`VillianId`) 

    FOREIGN KEY (`GunId`) REFERENCES `Gun` (`GunId`) 

    ) ; 

問題の構文のを無視してください。ちょうど読むのが簡単になりたかったのです。 Idは、現在単一のテーブルに存在しないため、自動生成される必要があります。私はこの種のストアドプロシージャを作成したことがありませんし、いくつかのガイダンスを探します。完全なソリューションは期待していません。ありがとう。ここで

+0

イベントの日付から来るんはどこ?元の殺人表には日付はありません。サロゲート識別子の導入は正規化ではないことに注意してください。推移的な関数依存性を 'gun - > manufacturer'から別のテーブル(IDまたは名前で識別されているかどうかにかかわらず)に抽出します。 – reaanb

+0

申し訳ありませんが、情報が元の表にあるとします。私の主な質問は、この性質のSPはどのように働くのでしょうか?あなたは私に例を挙げることができますか? –

答えて

0

はあなたが必要なものを行うことができます例を示します

DELIMITER ;; 

CREATE PROCEDURE `UnpackMurder`() 
BEGIN 
    INSERT INTO Manufacturer (ManufacturerName) 
    SELECT DISTINCT GunManufacturer 
    FROM Murder; 

    INSERT INTO Gun (ManufacturerId, GunName) 
    SELECT DISTINCT mf.ManufacturerId, md.GunName 
    FROM Murder md 
    JOIN Manufacturer mf ON md.GunManufacturer = mf.ManufacturerName; 

    INSERT INTO Villian (VillianName) 
    SELECT DISTINCT Villian 
    FROM Murder; 

    INSERT INTO `Event` (VillianId, GunId, `date`) 
    SELECT v.VillianId, g.GunId, md.`date` 
    FROM Murder md 
    JOIN Manufacturer mf ON md.GunManufacturer = mf.ManufacturerName 
    JOIN Gun g ON mf.ManufacturerId = g.ManufacturerId AND md.GunName = g.GunName 
    JOIN Villian v ON md.Villian = v.VillianName; 
END;; 

DELIMITER ; 
関連する問題