Внешний ключ как первичный ключ в MySQL - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть две зависимые таблицы как

CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB

CREATE TABLE post_meta
(
post_id int(11) unsigned REFERENCES posts(post_id) ON DELETE CASCADE,
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB

Вопрос 1: После ввода INSERT в posts, post_meta не принимает значение с ошибкой Duplicate entry XX for key 'PRIMARY. Как мне изменить структуру таблицы?

Вопрос 2: Как настроить создание соответствующей строки в post_meta при INSERT INTO posts? Я имею в виду создание пустой строки (только с идентификатором FK) в post_meta при создании строки в posts. Другими словами, с одинаковым количеством строк в двух столбцах без INSERT во втором столбце.

1 Ответ

3 голосов
/ 23 февраля 2012

Ваша текущая реализация выглядит как нормализованная.Вы уверены, что вам нужно хранить данные в двух разных таблицах?Может быть

CREATE TABLE posts
(
post_id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(255),
info varchar(255),
PRIMARY KEY(post_id)
) ENGINE=InnoDB

подойдет?

Предположение: если вы делаете это таким образом из-за проблем безопасности, тогда MySQL поддерживает привилегии уровня столбца .

Если нормализация ваших данных по некоторым причинам неприемлема, тоВы можете просто сделать post_id первичный ключ в обеих таблицах (не делайте его внешним ключом!) и добавить триггеры INSERT и DELETE в таблицу posts, которые будут вставлять или удалять соответствующие строки из post_meta.

ОБНОВЛЕНИЕ

Вы сказали в комментарии, что в таблице post_meta может быть несколько записей, соответствующих одной записи в posts.Это меняет много :

  1. Вы НЕ ДОЛЖНЫ использовать первичный ключ для post_id в таблице post_meta.Первичный ключ ДОЛЖЕН быть уникальным в области таблицы.
  2. Вы можете настроить свой внешний ключ (тот, который вы уже пытались) - это обеспечит автоматическое удаление метаданных с сообщениями.
  3. Если вам нужен PRIMARY KEY, определенный в post_metaзатем вы должны добавить новое (возможно, поле auto_increment) в таблицу post_meta и использовать его в качестве первичного ключа.(Кроме того, таблица может существовать даже без первичного ключа, но это противоречит большинству рекомендаций БД)
  4. Если вам нужно автоматически создавать мета-записи для каждого сообщения, вы можете добавить триггер INSERT для posts какЯ уже предложил.Другой подход заключается в использовании хранимой процедуры (и только хранимой процедуры) для добавления записей в posts - и в этом SP вы можете написать SQL для вставки необходимых записей в post_meta.
...