Может кто-нибудь объяснить внешние ключи MySQL - PullRequest
5 голосов
/ 13 ноября 2009

Я знаю, в чем заключается их вопрос, как вы связываете их или они автоматически связываются, если у вас одинаковые имена в разных таблицах.Вот пример:

Допустим, у меня есть таблица [orders] и таблица [customer].Каждая строка в таблице [orders] имеет номер customer_id, который связан с customer_id в таблице [customer].Так как же получить информацию о клиенте, сославшись на заказ?Каким будет SQL-запрос?

Ответы [ 5 ]

7 голосов
/ 13 ноября 2009

... как вы связываете их или они автоматически связываются, если у вас одинаковые имена в разных таблицах.

Это не автоматически, вам нужно добавить ограничение внешнего ключа к столбцу customer_id таблицы order. Это можно сделать во время создания таблицы или с помощью инструкции ALTER. Проверьте документацию для деталей. Как отметили другие, обратите внимание, что обе таблицы должны быть таблицами InnoDB (ограничения внешнего ключа не поддерживаются механизмом хранения MyISAM, который их игнорирует).

С или без ограничения FK запрос будет выглядеть примерно так:

SELECT * 
FROM CUSTOMER C, ORDER O
WHERE C.ID = O.CUSTOMER_ID
AND O.ID = ...

Ограничение FK "просто" гарантирует, что столбец CUSTOMER_ID таблицы ORDER не может содержать значений, которые не существуют в таблице CUSTOMER (за исключением потенциально NULL), и, таким образом, обеспечивает ссылочную целостность.

4 голосов
/ 13 ноября 2009

Внешние ключи не автоматически связаны общими именами. Одна вещь, которая часто смущает людей о внешних ключах MySQL, - то, что механизм таблиц MyISAM (по умолчанию) вообще не поддерживает внешние ключи. Вместо того, чтобы выдавать сообщение об ошибке при добавлении внешнего ключа в таблицу MyISAM, MySQL молча игнорирует определение внешнего ключа. Внешние ключи поддерживаются механизмом таблиц InnoDB, поэтому вы должны убедиться, что все таблицы, в которые вы хотите добавить внешние ключи, относятся к типу таблиц InnoDB. Чтобы добавить внешний ключ, вы должны сделать что-то вроде этого:

alter table fk_table add foreign key (fk_column) references pk_table (pk_column);
3 голосов
/ 13 ноября 2009

Полагаю, вы спрашиваете, потому что вы прочитали документацию, и это не имело для вас смысла.

Внешний ключ (FK) - это поле в TableB, которое содержит то же значение, что и поле, обычно первичный ключ (PK) в TableA. Так в псевдокоде:

Create TableA:
A_id is PK,
somefield,
anotherfield

Create TableB:
B_id is PK,
A_id is FK to TableA,
farmfield,
outstandingfield

Create constraint on TableB:
In TableB A_id references TableA(A_id),
Don't allow updates to TableA(A_id),
Delete records from TableB that have the same A_id as deleted records in TableA

Затем, когда вы делаете запрос, который включает обе таблицы, вы можете присоединиться к своему FK:

SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id);

А когда вы удаляете из Таблицы А, вам не нужно удалять из Таблицы Б. Это произойдет автоматически, потому что ограничение говорит: «Удалите записи из таблицы B, которые имеют тот же A_id, что и удаленные записи в таблице A».

А когда вы вставляете в TableB, вам нужно будет либо указать действительный A_id, либо, в зависимости от того, как вы определили столбец, оставить A_id =NULL.

1 голос
/ 13 ноября 2009

Иностранные ключи в mysql доступны только для определенных механизмов баз данных. MyISAM не является одним из них.

Я пытался использовать их с InnoDB, и хотя он гарантировал согласованность данных, я обнаружил, что это огромное снижение производительности, в результате чего многие заблокированные таблицы никогда не должны были блокироваться.

Основное преимущество использования внешних ключей - убедиться, что у вас никогда нет заказа, в котором нет клиента в базе данных. Но вам все равно придется обращаться к клиенту по запросу.

select * from customer, order where order.customer_id = customer.id and order.id = 5

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

Мои общие мысли о внешних ключах заключаются в том, что они великолепны, но их нельзя использовать в MySQL, и что Postgres обрабатывает их намного лучше.

0 голосов
/ 13 ноября 2009

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Первый результат при поиске "внешнего ключа mysql" в Google. В комплекте с примерами.

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