удалить основную строку и все дочерние элементы MySQL и PHP - PullRequest
1 голос
/ 26 июля 2010

Я унаследовал проект PHP, и клиент хочет добавить некоторые функциональные возможности в свою CMS, в основном CMS позволяет им создавать некоторые новости, все новости начинаются с одного и того же контента, и это сохраняется в одной таблице, фактически заголовок новости и статьи сохраняются в другой таблице, а изображения для новостей сохраняются в другой таблице, в основном, если базовая строка для новости удаляется, мне нужно удалить все связанные строки, база данных не настроена для работы с внешние ключи, так что я не могу использовать каскадное удаление, так как я могу удалить весь контент, который мне нужен, когда у меня есть только идентификатор базовой строки новостей?

Любая помощь была бы очень полезна. Извините, я не могу дать вам гораздо больше помощи, вот эта оригинальная схема SQL таблиц, если это поможет?

    --
-- Table structure for table `mailers`
--

CREATE TABLE IF NOT EXISTS `mailers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mailer_title` varchar(150) NOT NULL,
  `mailer_header` varchar(60) NOT NULL,
  `mailer_type` enum('single','multi') NOT NULL,
  `introduction` varchar(80) NOT NULL,
  `status` enum('live','dead','draft') NOT NULL,
  `flag` enum('sent','unsent') NOT NULL,
  `date_mailer_created` int(11) NOT NULL,
  `date_mailer_updated` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

-- --------------------------------------------------------

--
-- Table structure for table `mailer_content`
--

CREATE TABLE IF NOT EXISTS `mailer_content` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `headline` varchar(60) NOT NULL,
  `content` text NOT NULL,
  `mailer_id` int(11) NOT NULL,
  `position` enum('left','right','centre') DEFAULT NULL,
  `created_at` int(10) NOT NULL,
  `updated_at` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;

-- --------------------------------------------------------

--
-- Table structure for table `mailer_images`
--

CREATE TABLE IF NOT EXISTS `mailer_images` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(150) NOT NULL,
  `filename` varchar(150) NOT NULL,
  `mailer_id` int(11) NOT NULL,
  `content_id` int(11) DEFAULT NULL,
  `date_created` int(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

Стоит отметить, что схема не может быть изменена, и я не могу перейти на БД на MYISAM, чтобы я мог использовать внешние ключи.

Ответы [ 3 ]

2 голосов
/ 26 июля 2010

Добавить внешний ключ в таблицу mailer_content

FOREIGN KEY (mailer_id)
REFERENCES mailers(id)
ON DELETE CASCADE

Добавить внешний ключ в таблицу mailer_images

FOREIGN KEY (content_id)
REFERENCES mailer_content(id)
ON DELETE CASCADE

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

1 голос
/ 26 июля 2010

Стоит отметить, что схема не может быть изменена, и я не могу перейти на БД на MYISAM, чтобы я мог использовать внешние ключи.

Почему нельзя изменить схему? Вы разработали приложение, не так ли? Даже если вы этого не сделали, добавление правильных ключей - это просто вопрос добавления правильных индексов и последующего изменения правильных столбцов. @ В ответе Михаила Пахантоса есть то, что кажется правильным битом SQL.

Кроме того, InnoDB выполняет внешние ключи, а не MyISAM. Ты уже в порядке.

Если бы вы могли изменить схему, сделав соответствующие идентификаторы действительными, действительные внешние ключи и использовав ON DELETE CASCADE, сработали бы. Или, может быть, триггеры. Но это всего лишь просьба об этом.

Теперь по какой-то причине ON DELETE CASCADE здесь не очень нравится. Я не согласен с причинами неприязни других людей, но я не согласен с их чувствами. Если ваше приложение не было разработано для grok НА УДАЛЕННОМ КАСКАДЕ, вас ждет мир неприятностей.

Но, учитывая ваше требование ...

в основном, если базовая строка для новости удалена, мне нужно удалить все связанные строки

... это запрос на УДАЛЕННЫЙ КАСКАД.

Итак, это может быть шоком, но если вы не можете изменить базу данных, вам просто нужно выполнить свою работу в коде. Я полагаю, что удаление новостной статьи происходит только в одном месте в вашем коде, верно? Если нет, то лучше. Исправьте это сначала. Затем просто убедитесь, что вы удалили все правильные строки в соответствующем порядке . А затем задокументируйте это!

0 голосов
/ 26 июля 2010

Если вы не можете изменить схему, то триггеры не являются опцией.

InnoDB поддерживает транзакции , поэтому удаление из двух таблиц не должно быть проблемой,В чем именно ваша проблема?

PS Стоит отметить, какую версию сервера вы используете.

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