2012-04-11 34 views
1

私はphpmyadminの中で構文でテーブルを作成しました:、SQL外部キー

"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=INNODB' at line 11 "

私はテーブルを作成の最後にTYPE = INNODBを削除する場合:

DROP TABLE IF EXISTS users; 
DROP TABLE IF EXISTS info; 

CREATE TABLE users (
    user_id int unsigned NOT NULL auto_increment, 
    email varchar(100) NOT NULL default '', 
    pwd varchar(32) NOT NULL default '', 
    isAdmin int(1) unsigned NOT NULL, 
    PRIMARY KEY (user_id) 
) TYPE=INNODB; 

CREATE TABLE info (
    info_id int unsigned NOT NULL auto_increment, 
    first_name varchar(100) NOT NULL default '', 
    last_name varchar(100) NOT NULL default '', 
    address varchar(300) NOT NULL default '', 
    zipcode varchar(100) NOT NULL default '', 
    personal_phone varchar(100) NOT NULL default '', 
    mobilephone varchar(100) NOT NULL default '', 
    faxe varchar(100) NOT NULL default '', 
    email2 varchar(100) NOT NULL default '', 
    country varchar(100) NOT NULL default '', 
    sex varchar(1) NOT NULL default '', 
    birth varchar(1) NOT NULL default '', 

    email varchar(100) NOT NULL default '', 
    PRIMARY KEY (info_id), 
    FOREIGN KEY (email) REFERENCES users(email) ON UPDATE CASCADE ON DELETE CASCADE 
) TYPE=INNODB; 

をしかし、エラーを示してい

"#1005 - Can't create table 'curriculo.info' (errno: 150) ".

答えて

1

ENGINE = INNODBではなく、TYPE = InnoDBを使用してください。 MySQLのドキュメント、バージョン5.1、CREATE TABLE syntaxから

Note

The older TYPE option was synonymous with ENGINE . TYPEhas been deprecated since MySQL 4.0 but is still supported for backward compatibility in MySQL 5.1 (excepting MySQL 5.1.7). Since MySQL 5.1.8, it produces a warning. It is removed in MySQL 5.5. You should not use TYPE in any new applications, and you should immediately begin conversion of existing applications to use ENGINE instead. (See Section D.1.64, “Changes in MySQL 5.1.8 (Not released)”.)


あなたはこの外部キーを持つようにしたい場合:

FOREIGN KEY (email) REFERENCES users(email) 

users(email)UNIQUE制約を持つ必要があります。すべての外部キーは、プライマリキーまたはユニークキーのいずれかを参照する必要があります。 infoテーブル内の行が(FKを介して)唯一のユーザー(usersテーブルの行)を参照するようにします。


さまざまな理由で、狭い(小さい)列と一定の幅の列を外部キーとして使用することをお勧めします。 emailは100文字で、100〜300バイト(文字セットによって異なる)です。だから、ちょうど4バイトの幅であるをFKとして使うとよいでしょう:

CREATE TABLE info (
    ... 
      ---- email varchar(100) NOT NULL default '', 
      ---- removed 
    user_id int unsigned NOT NULL, 
    PRIMARY KEY (info_id), 
    FOREIGN KEY (user_id) REFERENCES users(user_id) 
     ON UPDATE CASCADE ON DELETE CASCADE 
) TYPE=INNODB; 
+0

だと思います"#1005 - テーブル 'curriculo.info'(errno:150)を作成できません"というエラーメッセージが表示され続けます –

+0

おそらく、あなたに 'UNIQUE KEY(電子メール)'がないので、 'users'テーブルにあります。 –

+0

はい、それでした!ありがとう –

2

「エンジン= INNODB」を作成の最後に試してください。 (TYPEではない)

もしあなたがそれを持っていなければ、mysql環境設定のあなたのデフォルトのエンジンタイプに依存して動作しないかもしれません... MyIsam(最も一般的なデフォルトエンジン)は外部キーをサポートしていません。

+0

私はコマンド "show table status;"を実行します。タイプがINNODBであることが示されています。 –

+0

try:テーブルを作成してを作成すると、より多くの情報が得られるかもしれません。なぜこのような場合にmysqlがTypeとEngineを混乱させるのか分かりませんが、http://dev.mysql.com/doc/refman/5.1/en/create-table.htmlをチェックするとそこにEngineキーワードが表示されます。 –

+0

は "ENGINE = InnoDB DEFAULT CHARSET = latin1"と表示しますが、エラー "#1005 - テーブル 'curriculo.info'(errno:150)を作成できません"魔女私はその外国のエラー、 –