Первичный и внешний ключ в SQL? - PullRequest
2 голосов
/ 25 октября 2011

Я не уверен в этом, но нужно ли явно создавать внешний ключ в команде SQL?

Этот парень сделал это:

CREATE TABLE languages (
lang_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
lang VARCHAR(60) NOT NULL,
lang_eng VARCHAR(20) NOT NULL,
PRIMARY KEY (lang_id),
UNIQUE (lang)
);


CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT(3) UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(150) NOT NULL,
PRIMARY KEY  (thread_id),
INDEX (lang_id),
INDEX (user_id)
);

В этом случае он делает это?означает, что INDEX (lang_id) автоматически становится FOREIGN KEY?Я знаю, что INDEX ускоряет поиск, но я не понимаю, что такое внешний ключ

. Буду очень признателен за любой ответ

.

Ответы [ 5 ]

2 голосов
/ 25 октября 2011

Нет.Индекс - это просто ... индекс по полю.Внешний ключ сообщает MySQL, что «это конкретное поле ДОЛЖНО иметь соответствующую запись в этой таблице».

Внутренний дизайн MySQL требует, чтобы все поля, используемые в качестве внешних ключей, были проиндексированы, но современные версии автоматически создадут этот индексдля вас.

Обратное неверно, кто бы то ни было.Добавление индекса в поле не превращает его в внешний ключ - определение внешнего ключа также должно включать в себя то, что является внешней таблицей / полем, а в простом объявлении индекса нет этой информации.

Для вашего примератаблица, вам нужно иметь

...
INDEX (lang_id),
FOREIGN KEY (lang_id) REFERENCES languages (lang_id),
...

для создания внешнего ключа.

1 голос
/ 25 октября 2011

Различия заключаются в следующем: -

  • Первичный ключ уникально идентифицирует запись в таблице с несколькими строками.

  • Индекс - это общий термин, в котором вы можете создать более одного индекса для таблицы, в этом случае база данных создает индексы на основе указанных вами столбцов, поэтому при запросе соответствующего индекса будет пнуть и дать вам результаты быстрее.

  • Внешний ключ, с другой стороны, говорит, что этот столбец в таблице b является основным столбцом в таблице A, поэтому при вводе строк в таблицу B база данных проверяет, существует ли указанный столбец / данные в таблица А в противном случае выдает ошибку.

1 голос
/ 25 октября 2011

Теперь у вас есть две таблицы с первичными ключами и индексами для этих значений первичного ключа.

Вы можете остановиться здесь, если хотите, но у вас не будет объявленной ссылочной целостности, обеспечивающей такое отношение между таблицами языка и потоков.

Для этого вы должны явно создать отношение внешнего ключа, как описано здесь - http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

1 голос
/ 25 октября 2011

Внешний ключ не должен быть явно объявлен

CREATE TABLE threads (
thread_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
lang_id TINYINT(3) UNSIGNED NOT NULL FOREIGN KEY FK_1 REFERENCES languages(lang_id),
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(150) NOT NULL,
PRIMARY KEY  (thread_id),
INDEX (lang_id),
INDEX (user_id)
);
1 голос
/ 25 октября 2011

Внешний ключ означает, что значение (я) должно существовать в указанном столбце (столбцах). Это не автоматически - вам нужно написать это явно.

FOREIGN KEY lang_id REFERENCES languages (lang_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...