Использование ссылок в MYSQL - PullRequest
7 голосов
/ 23 июня 2010

Я получил ответ на другой вопрос здесь:

Схема БД для чатов?

Это отличный ответ, но я не понимаю немного о ссылках. Я могу делать операторы SQL, но я никогда не использовал ссылки.

  1. Для чего они используются?
  2. Как они используются?
  3. Приведите пример, пожалуйста

Ответы [ 2 ]

12 голосов
/ 23 июня 2010

Ключевое слово REFERENCES является частью ограничения внешнего ключа , и это заставляет MySQL требовать, чтобы значения в указанных столбцах таблицы ссылок также присутствовали в указанном столбце (s) ссылочной таблицы.

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

Конкретный пример: каждый сотрудник долженпринадлежат отделу, тогда вы можете добавить ограничение внешнего ключа из employee.departmentid, ссылающегося на department.id.

. Выполните следующий код, чтобы создать две тестовые таблицы tablea и tableb, где столбец a_id вtableb ссылается на первичный ключ tablea.tablea заполняется несколькими строками.

CREATE TABLE tablea (
    id INT PRIMARY KEY,
    foo VARCHAR(100) NOT NULL
) Engine = InnoDB;

INSERT INTO tablea (id, foo) VALUES
(1, 'foo1'),
(2, 'foo2'),
(3, 'foo3');

CREATE TABLE tableb (
    id INT PRIMARY KEY,
    a_id INT NOT NULL,
    bar VARCHAR(100) NOT NULL,
    FOREIGN KEY fk_b_a_id (a_id) REFERENCES tablea (id)
) Engine = InnoDB;

Теперь попробуйте следующие команды:

INSERT INTO tableb (id, a_id, bar) VALUES (1, 2, 'bar1');
-- succeeds because there is a row in tablea with id 2

INSERT INTO tableb (id, a_id, bar) VALUES (2, 4, 'bar2');
-- fails  because there is not a row in tablea with id 4

DELETE FROM tablea WHERE id = 1;
-- succeeds because there is no row in tableb which references this row

DELETE FROM tablea WHERE id = 2;
-- fails because there is a row in tableb which references this row

Важное примечание: Обе таблицы должны быть таблицами InnoDB, или ограничение игнорируется.

2 голосов
/ 23 июня 2010

Ключевое слово REFERENCES показывает ограничение внешнего ключа, что означает, что:

FOREIGN KEY (`chat_id` ) REFERENCES `chats`.`chat` (`id` )

... столбец chat_id в текущей таблице может содержать только те значения, которые уже существуют в таблице chat, столбец id.

Например, если столбец CHAT.id содержит:

id
----
a
b
c

.. Вы не можете добавлять никакие значения, кроме a / b / c, в столбец chat_id.

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