2016-12-11 36 views
2

私は春のセキュリティに関するチュートリアルに従いました。いくつかの場所では、データベースに2つのテーブルuserauthoritiesを作成する必要があります。これを実行しながら、このチュートリアルのように提案されているこのスクリプトを使用しています。 http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-schema.htmlMySQL:ERROR 1215:外部キー制約を追加できません

私は既にuserテーブルをデータベースに持っていますので、autohiritesテーブルを追加するだけです。私はMySQLのを使用していますので、私は以下のように、そのクエリを変更しました:

また
create table authorities (
     username varchar(70) not null, 
     authority varchar(50) not null, 
     CONSTRAINT fk_authorities_users foreign key(username) references user(userFirstName)); 
     create unique index ix_auth_username on authorities (username,authority); 

、ここでも私のユーザーテーブルです:

CREATE TABLE `user` (
    `userId` INT(11) NOT NULL AUTO_INCREMENT, 
    `userFirstName` VARCHAR(70) NOT NULL, 
    `userLastName` VARCHAR(70) NOT NULL, 
    `userEmail` VARCHAR(70) NOT NULL, 
    `userAddress` VARCHAR(500) NULL DEFAULT NULL, 
    `userPhoneNumber` INT(13) NULL DEFAULT NULL, 
    `isActive` BINARY(50) NULL DEFAULT '1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', 
    `userPassword` VARCHAR(50) NOT NULL, 
    `userConfirmPassword` VARCHAR(50) NOT NULL, 
    PRIMARY KEY (`userId`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=2 
; 

私は私の最初のクエリを実行しようとしています私は得る機関テーブルを作成するつもりですエラー1215:外部キー制約を追加できませんエラー。

これまでのところ、私は以下のこれらの質問に見てきたが、それらのどれも私の問題に答えていない+私は、彼らは両方とも同じ質問だと思います:

MySQL Cannot Add Foreign Key Constraint

MySQL Error 1215: Cannot add foreign key constraint

+0

両方のテーブルがInnoDBに設定されていますか? – Wouter

+0

権限テーブルのユーザー名の主キーを作成します。 – jophab

答えて

1

を作ってみましょうuserFirstName列は一意です。

1

エンジンがauthoritiesのものであるとは言及していませんが、userテーブルのuserFirstNameにはユニークなインデックスがありません。つまり、authoritiestはINNODBである必要があります。 because

InnoDBでは、外部キー制約で非固有キーを参照できます。 これは標準SQLに対するInnoDBの拡張です。

しかし、私はこれを全くお勧めしません。PRIMARY KEYを参照する外部キーを持つことをお勧めします。別の固有キーは使用できません。

あなたが本当にやるべきことは次のようにあなたのテーブルを変更です:

CREATE TABLE authorities (
     userid INT(11) not null, 
     authority varchar(50) not null, 
     CONSTRAINT fk_authorities_users foreign key(username) references user(userid)); 
     create unique index ix_auth_username on authorities (username,authority)); 

あなたはPRIMARY KEYを参照するが、より重要なのは、あなたのテーブルから冗長性を大いに軽減されているようにすることで。両方のテーブルで同じ〜70文字のフィールドが繰り返されることは絶対にありません。

+0

警告ありがとうございます。あなたの前に1分前に同様の答えが与えられました。しかし、私は自分のコードで "名前の代わりにIDを使う"と考えます。ありがとう! – Prometheus

+0

もし私が説明を与えるのを嫌っていたとしても、その前によく答えを出していたかもしれません:-) – e4c5

+0

ouはあなたのdatabseが正規化されていないとあなたが実装すべきuserIdのことを考えるべきではありません。 – e4c5

関連する問題