2011-10-27 24 views
3

私はDBの人ではありませんが、私はこの人をちょっとハッキングしていて、問題を釘付けにすることはできません。関連するドキュメントページ(http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html)を読んだところ、どこに構文があるのか​​分かりません。MySQLのCREATE TABLEとFOREIGN KEYエラー

ERROR 1064 (42000) at line 84: 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 'FOREIGN KEY (user_id) REFERENCES user(id) 
    ON DELETE RESTRICT ON UPDATE C' at line 5 

関連するSQL順序(ID)とユーザー(ID)は、それぞれの表の自動インクリメントint(10)フィールドです。

DROP TABLE IF EXISTS `user_orders`; 
CREATE TABLE `user_orders` (
`user_id` int(10) unsigned NOT NULL default '0', 
`order_id` int(10) unsigned NOT NULL default '0', 
PRIMARY KEY (`user_orders_user_id`, `user_orders_order_id`) 
FOREIGN KEY (user_id) REFERENCES user(id) 
    ON DELETE RESTRICT ON UPDATE CASCADE, 
FOREIGN KEY (order_id) REFERENCES order(id) 
    ON DELETE RESTRICT ON UPDATE CASCADE, 
) AUTO_INCREMENT=50; 

私が逃したものを説明することができれば幸いです。

PRIMARY KEY (`user_orders_user_id`, `user_orders_order_id`), -- <------- 
FOREIGN KEY (user_id) REFERENCES user(id) ... 

そして、あなたはあなたがあなたの外部キーが施行したい場合はInnoDBエンジンを使用したいと思う:

答えて

5

あなたはPKの後にカンマが欠けている、私はあなたが持っていると信じて

) AUTO_INCREMENT=50 ENGINE=InnoDB; 
+0

素晴らしい、ありがとう、特にRE:InnoDBを使用しています。 – elithrar

-1

あなたが何をしているのか分かりません。あなたのコードはエラーでいっぱいです。

user_idのint(10)符号なしNOT NULLデフォルト '0'、 order_id INT(10)符号なしNOT NULLデフォルト '0'、 PRIMARY KEY(user_orders_user_iduser_orders_order_iduser_orders_user_idから来るのか

。そして、なぜダブル。 時間をかけてコードを読んでください。それは であるべきで、PRIMARY KEY(user_idorder_id

FOREIGN KEY(USER_ID)は、DELETEのユーザー(ID) を参照UPDATE CASCADE、 FOREIGN KEY(ORDER_ID)上でRESTRICT DELETE ON順(ID) を参照にRESTRICT更新CASCADE、 )AUTO_INCREMENT = 50;

私は別のアプローチをとることをお勧めします。 最初にカンマを並べ替えて、簡単に切り替えることができます。 次に、あなたのFKラインの前に#を置きます。

DROP TABLE IF EXISTS `user_orders`; 
CREATE TABLE `user_orders` 
(user_id int(10) unsigned NOT NULL default '0' 
, order_id int(10) unsigned NOT NULL default '0' 
, PRIMARY KEY (`user_id`, `order_id`) 
#, FOREIGN KEY (user_id) REFERENCES userS(id) ON DELETE RESTRICT ON UPDATE CASCADE 
# , FOREIGN KEY (order_id) REFERENCES order_id) ON DELETE RESTRICT ON UPDATE CASCADE 
) ENGINE=InnoDB 
# AUTO_INCREMENT=50 
DEFAULT CHARSET=utf8 
; 

簡略化。 これは少なくとも実行されます。 一度に1行のコメントを外します。

タイプ

SHOW ENGINE INNODB STATUS;

奇妙なmysqlエラーが発生した場合はいつでも。探す

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
160323 10:25:43 Error in foreign key constraint of table DEMO/user_orders: 
FOREIGN KEY (user_id) REFERENCES userS(id) ON DELETE RESTRICT ON UPDATE CASCADE 

これは、以下の解決策につながります。

CREATE TABLE `USERS` 
(`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT 
, `NAME` VARCHAR(10) NOT NULL 
, `EMAIL` VARCHAR(20) NOT NULL 
, `ACTIVE` BOOLEAN NOT NULL default 0 
, CONSTRAINT PK PRIMARY KEY (`ID`) USING BTREE 
, UNIQUE KEY `UK_ID` (`ID`) USING BTREE 
, UNIQUE KEY `UK_NAME` (`NAME`) 
, UNIQUE KEY `UK_EMAIL` (`EMAIL`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS `user_orders`; 
CREATE TABLE `user_orders` 
(user_id int(10) unsigned NOT NULL # default '0' 
, order_id int(10) unsigned NOT NULL # default '0' 
, PRIMARY KEY (`user_id`, `order_id`) 
, FOREIGN KEY (user_id) REFERENCES USERS(id) ON DELETE RESTRICT ON UPDATE CASCADE 
# , FOREIGN KEY (order_id) REFERENCES order_id ON DELETE RESTRICT ON UPDATE CASCADE 
) ENGINE=InnoDB 
# AUTO_INCREMENT=50 
DEFAULT CHARSET=utf8 
; 
関連する問題