Как мне создать таблицу MySQL, когда она имеет два внешних ключа? - PullRequest
3 голосов
/ 04 марта 2010

Каким будет код для создания таблицы с двумя внешними ключами?

У меня есть таблица USER и таблица PICTURE. Поскольку пользователь USER может иметь несколько PICTURE, а многие PICTURE могут принадлежать пользователю USER, мне нужна третья таблица с обоими первичными ключами.

Спасибо, ТАК, как обычно, вы неоценимы для новичка в обучении. :)

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Я не могу говорить конкретно о mySQL, но в большинстве баз данных, с которыми я работал, вы можете поместить в таблицу столько внешних ключей, сколько вам нужно. Но вы можете иметь только один первичный ключ. Третий стол с обоими ключами - правильный выбор. Создайте внешний ключ для каждой из двух других таблиц и первичный ключ, состоящий из обоих идентификаторов в таблице.

1 голос
/ 04 марта 2010

Если я правильно понял, вам может потребоваться сделать что-то вроде следующего:

CREATE TABLE users (
    user_id  INT NOT NULL PRIMARY KEY,
    name     VARCHAR(50) NOT NULL
) ENGINE=INNODB;

CREATE TABLE pictures (
    picture_id  INT NOT NULL PRIMARY KEY,
    filename    VARCHAR(255) NOT NULL,
    posted_by   INT NOT NULL,
    FOREIGN KEY (posted_by) REFERENCES users(user_id)    
) ENGINE=INNODB;

CREATE TABLE users_in_pictures (
    user_id     INT NOT NULL,
    picture_id  INT NOT NULL,
    PRIMARY KEY (user_id, picture_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id),    
    FOREIGN KEY (picture_id) REFERENCES pictures(picture_id)    
) ENGINE=INNODB;

Обратите внимание, что каждое изображение может быть опубликовано пользователем. Фактически поле posted_by ограничено внешним ключом, который ссылается на таблицу users.

Кроме того, я предполагаю, что вы хотите отметить фотографии ala-facebook. В этом случае вы можете использовать третью таблицу, которая использует составной первичный ключ для (user_id, picture_id), и оба поля также ограничены соответствующей таблицей.

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