2012-05-31 2 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.id и items.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.treaty и treaties.id этот ключ должен использоваться и тип не должен быть ALL. Что не так?

Пожалуйста, помогите!

Спасибо!

ответ

1

Как объяснено в the manual:

Выходной сигнал из EXPLAIN показывает в колонке типа ALL, когда MySQL использует сканирование таблицы, чтобы разрешить запрос. Обычно это происходит при следующих условиях:

[...]

  • таблица настолько мала, что она быстрее выполнять сканирование таблицы, чем возиться с ключом поиска. Это характерно для таблиц с менее чем 10 строками и короткой длиной строки. Не волнуйся в этом случае.
+0

Благодарим вас за ответ! Действительно, объясните, что запрос изменился после добавления более 10 строк. Спасибо!!!! – lubart

Смежные вопросы