2012-02-23 1 views
0

У меня есть две зависимые таблицы какВнешний ключ в качестве первичного ключа в MySQL

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 во второй столбец.

+0

Если строка 'post_meta' имеет строку' posts', почему бы вам не сделать 'post_id' FK в' post_meta'? Question2: с триггером может быть –

ответ

3

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

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 supports Column-level privileges.

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

UPDATE

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

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

Это простой пример, мета-таблица содержит отдельную информацию. Например, несколько мета для разных типов сообщений, которые будут работать с JOIN при необходимости. – Googlebot

+0

Обновлен мой ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^