2017-08-28 30 views
1

私は顧客テーブルとトランザクションテーブルの2つのテーブルを持っています。トランザクションテーブルには、顧客テーブルの2つのフィールドを参照する2つの外部キーがあります。MySQLエラー[1215] [HY000] - 外部キーを追加できません

私は、顧客テーブルを追加しましたが、私はトランザクションテーブルを追加しようとすると、それは私を与える:

SQLエラー[1215]は、[HY000]続いて、外部キー制約に

を追加することはできませんされています私のテーブル。

CREATE TABLE customerDetails(
    CustomerID varchar(10)NOT NULL, 
    AccountNumber varchar(15) NOT NULL, 
    CustomerName varchar(60)NOT NULL, 
    Address varchar(60), 
    phone varchar(15), 
    email varchar(50), 
    joinedDate date, 
    primary key(CustomerID) 
) 

CREATE TABLE transactions(
    TraceNumber varchar(30) NOT NULL, 
    AccountNumber varchar(15)NOT NULL, 
    CustomerName varchar(60)NOT NULL, 
    TransactionType varchar(15) NOT NULL, 
    TransactionDateTime datetime NOT NULL, 
    TransactionAmount double DEFAULT NULL, 
    PRIMARY KEY (TraceNumber), 
    FOREIGN KEY(CustomerName) REFERENCES customerDetails(CustomerName), 
    FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+4

customerDetails(CustomerName)は、pkまたは一意である必要があります。 – jarlh

+1

顧客名をトランザクションに保存することは、悪い考え(と冗長)のように見えます。名前が揺らぐことはほとんどありませんし、名前が変更された場合はどうなりますか。 –

+1

@ P.Salmon多くの場合、トランザクション時の顧客の詳細を保持することが法的要件です。これを達成する1つの方法は、それらをトランザクションテーブルにも保存することです。それは素晴らしくはありませんが、しばしば役に立ちます。 – Shadow

答えて

4

問題はここにある:外部キー関係を作るための

FOREIGN KEY(AccountNumber) REFERENCES customerDetails(AccountNumber) 

、親テーブルの列は、主キーまたは一意である必要がありますが、あなたの場合には、AccountNumberはプライマリとしてもユニークでもありません。それに応じてそれを変更してください。

+0

Thanks Mayank。あなたのソリューションはこの問題を解決しました。 –

3

CustomerIDのプライマリカラムを持つcustomerDetailsテーブルを作成したので、CustomerIDを使用する必要があります。 CustomerIDは、外部キーではなくcustomerNameと呼ばれます。

以下の構造を使用してtransactionsテーブルを作成します。

CustomerIDとマップする予定であるため、AccountNumberをここに割り当てる必要はありません。

CREATE TABLE transactions(
    TraceNumber varchar(30) NOT NULL, 
    AccountNumber varchar(15)NOT NULL, 
    CustomerID INT NOT NULL, 
    TransactionType varchar(15) NOT NULL, 
    TransactionDateTime datetime NOT NULL, 
    TransactionAmount double DEFAULT NULL, 
    PRIMARY KEY (TraceNumber), 
    FOREIGN KEY(CustomerName) REFERENCES customerDetails(CustomerID) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

あなたの答えはVigneshありがとうございます。しかし、これは私がプロジェクトの要件に応じてマッピングする必要がある方法です。何とか役立つ答え。 –

関連する問題