2014-07-15 95 views
0

我想建立最簡單的MySQL數據庫與兩個表 - 用戶和多對多的朋友相關表。簡單的多對多的sql關係

因此,這裏是我最初的SQL:

DROP TABLE IF EXISTS `friends`; 
CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL, 
    `friend_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`user_id`,`friend_id`), 
    KEY `FK_FRIENDS_2` (`friend_id`), 
    CONSTRAINT `FK_FRIENDS_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), 
    CONSTRAINT `FK_FRIENDS_2` FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我在英諾日誌收到以下錯誤:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
2014-07-15 02:10:36 1341ab000 Error in foreign key constraint of table pc/friends: 
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), 
    CONSTRAINT `FK_FRIENDS_2` FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8: 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

/* 
Source Server Type : MySQL 
Source Server Version : 50614 
Target Server Type : MySQL 
Target Server Version : 50614 
File Encoding   : utf-8 
*/ 

SET NAMES utf8; 
SET FOREIGN_KEY_CHECKS = 0; 

-- ---------------------------- 
-- Table structure for `users` 
-- ---------------------------- 
DROP TABLE IF EXISTS `users`; 
CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) COLLATE utf8_polish_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_idx` (`name`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; 

SET FOREIGN_KEY_CHECKS = 1; 
試圖創建第二個表時

現在

我如何設置索引以使其工作?

回答

2

您已給出您的約束名稱,這是不必要的。您可以刪除名稱或重命名FK_FRIENDS_2約束之一。不過,我喜歡更緊湊的語法:

CREATE TABLE `friends` (
    `user_id` int(10) unsigned NOT NULL REFERENCES `users` (`id`), 
    `friend_id` int(10) unsigned NOT NULL REFERENCES `users` (`id`), 
    PRIMARY KEY (`user_id`, `friend_id`), 
    KEY (`friend_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

一個鍵和外鍵約束可能會發生衝突的名稱似乎令人困惑的事實。事實上,只要將關鍵和約束看作是同一事物的不同類型即可。

+0

謝謝,這個伎倆。 –