2017-04-18 37 views
0

作成しているデータベースの外部キーを確立する際に問題があります。コードが実行されているようだが、テーブルにクエリを実行すると、私は外来キーだと思ったものを返さない。ここでMySQL - 制約と外部キーの追加

は、私が働いているものです:

これは私の「工芸」テーブルの小さな抜粋です:ここでは

idCrafting Crafting_Recipe  Item1   ITEM1_ID 
1    Copper_Bar   Copper_Ore  NULL  
2    Gold_Bar    Gold_Ore   NULL 

は、私が働いているアイテムテーブルです:

Item_id  Item_Name 
1   Battery_Pack 
2   Clay 
3   Coal 
4   Copper_Ore 
5   Copper_Bar 

これは外部キーを作成する方法です。 Craftingテーブルには、Item1、Item2、Item3で表される3つのアイテムと、ITEM1_ID、ITEM2_ID、ITEM3_IDの各列があります。 Itemテーブルの適切なITEM_idsをITEM_ID列に移入する外部キーを作成したいとします。

ALTER TABLE StardewValley.Crafting 
    ADD CONSTRAINT Item1_fk_Crafting 
    FOREIGN KEY (ITEM1_ID) REFERENCES Items (Item_id); 

これは私がオリジナルの工芸テーブルを作成する方法である:

CREATE TABLE IF NOT EXISTS StardewValley.Crafting (
    idCrafting INT NOT NULL AUTO_INCREMENT, 
    Crafting_Recipe VARCHAR(45) NOT NULL, 
    Item1 VARCHAR(45) NULL, 
    Item2 VARCHAR(45) NULL, 
    Item3 VARCHAR(45) NULL, 
    PRIMARY KEY (`idCrafting`)); 

私はいくつかのテーブルから主キーを使用して、いくつかの他のテーブルを持っていると私はそれが正常に動作させることはできません。私はこの1つを他のテーブルだけを参照するように動作させるために苦労しています。

ありがとうございます!

編集:

私は、同様工芸テーブルにアイテムIDを追加しようとしたことを追加するのを忘れ:

ALTER TABLE StardewValley.Crafting ADD ITEM1_ID INT; 
ALTER TABLE StardewValley.Crafting ADD ITEM2_ID INT; 
ALTER TABLE StardewValley.Crafting ADD ITEM3_ID INT; 
ALTER TABLE StardewValley.Crafting ADD Item_id INT; 

を何もしていないようでしたどの。

+1

「Crafting」テーブルで「Item_id」が「4」のときに、「Item1」の列に「Copper_Ore」が表示されます。それは本当に良い考えではありません。 2つのテーブルにまたがって 'Item_Name'の定義を広げてはいけません。参照として 'Item_id'だけを含めるだけで十分です。また、他の目的のために 'Item_Name'を取得する場合は、' SELECT'クエリで 'JOIN'を使用してください。 –

+0

私はCraftingレシピにある名前とIDを持つアイテムを含む関係を表すテーブルを作成しようとしていました。クラウニングとアイテムテーブルの間でJOINを使用してクエリを実行しようとしましたが、動作しませんでした。私はそれが動作するかどうかを確認するためにもう一度試すことができます、それはより良いだろう。 – Babeeshka

+1

まあ、データベースが正規化されていれば、それを維持しスケーリングするほうがはるかに簡単になります。多対多の関係が議論されているこの[Q&A](http://stackoverflow.com/q/2923809/2298301)を見てください( 'Product' /' Company'関係はあなたにいくつかの類似点を描くのに役立ちますあなたのシナリオで)。また、この[post](http://stackoverflow.com/q/3486644/2298301)は多対多の関係のために 'SELECT'クエリがどのように記述されるかを示しています。 –

答えて

1

あなたが例えば、FOREIGN KEY制約を追加する前に値を更新してみてくださいでした:

UPDATE Crafting 
SET ITEM1_ID = (SELECT Item_id FROM items WHERE Item_id = Item1 LIMIT 1); 

これは、すべての値が親テーブル内のキーを修正するためにポイントを確認します。また、Item_idは既にItemsテーブルの主キーです。

関連する問題