2012-05-31 35 views
1

我有两个表:MySQL的外键不起作用

CREATE TABLE IF NOT EXISTS treaties(
id INT NOT NULL AUTO_INCREMENT, 
name varchar(50) NOT NULL, 
PRIMARY KEY(id) 
)ENGINE=InnoDB; 

CREATE TABLE IF NOT EXISTS items(
id INT NOT NULL AUTO_INCREMENT, 
treaty INT NOT NULL, 
item varchar(20), 
PRIMARY KEY(id), 
FOREIGN KEY (treaty) REFERENCES treaties(id) 
     ON UPDATE RESTRICT 
     ON DELETE RESTRICT 
)ENGINE=InnoDB; 

在那之后我插入几行中的每个表,但值treaties.iditems.treaty是相同的。 当我运行

EXPLAIN SELECT * 
FROM `items` 
JOIN `treaties` ON `items`.`treaty` = `treaties`.`id` 
WHERE 1 

我获得:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 
1 | SIMPLE  | treaties| ALL | PRIMARY  | NULL| NULL | NULL| 3 | 
1 | SIMPLE  | items | ALL | treaty  | NULL| NULL | NULL| 4 | Using where; Using join buffer 

我想如果我有items.treatytreaties.id之间的外键此键必须使用,类型不能为ALL。 有什么不对?

请帮帮我!

谢谢!

回答

1

the manual解释:

EXPLAIN的输出显示在类型列ALL当MySQL使用表扫描解决的查询。这通常在下列情况下发生:

[...]

  • 表是如此之小,这是更快地执行表扫描比一键查找打扰。这对于行数少于10行且行长度较短的表很常见。在这种情况下不要担心。
+0

谢谢您的回复!真的,添加更多10行后,解释查询更改。谢谢!!!! – lubart