1

我继承了一个 PHP 项目,客户想在他们的 CMS 中添加一些功能,基本上 CMS 允许他们创建一些新闻,所有新闻都以相同的内容开头,并且保存在一个表中,实际上是新闻标题文章保存在另一个表中,新闻的图像保存在另一个表中,基本上如果新闻的基本行被删除,我需要删除所有相关行,数据库没有设置为使用外键所以我不能使用级联删除,那么当我只有基本新闻行的 ID 时,如何删除我需要的所有内容?

任何帮助都会非常有帮助我很抱歉我不能给你更多帮助,如果有帮助,这是表方案的原始 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 ;

值得注意的是,架构不能更改,也不能将数据库更改为 MISAM,以便我可以使用外键。

4

3 回答 3

2

将外键添加到表 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

于 2010-07-26T07:41:42.803 回答
1

值得注意的是,架构不能更改,也不能将数据库更改为 MISAM,以便我可以使用外键。

为什么不能更改架构?你设计了这个应用程序,不是吗?即使您没有这样做,添加正确的键也只是添加正确的索引,然后更改正确的列。@Michael Pakhantosv 的答案看起来是正确的 SQL。

此外,执行外键的是 InnoDB,而不是 MyISAM。你已经很好了。

如果您可以更改架构,则使适当的 ID 成为实际的、真正的外键并使用 ON DELETE CASCADE 将起作用。或者可能是触发器。但这只是要求。

现在,由于某种原因,这里不太喜欢 ON DELETE CASCADE。我不同意其他人不喜欢它的原因,但我不同意他们的观点。除非您的应用程序设计为在DELETE CASCADE 上进行探索,否则您将陷入困境。

但是,鉴于您的要求...

基本上,如果新闻的基本行被删除,我需要删除所有相关行

...那是要求ON DELETE CASCADE。

因此,这可能会让人感到震惊,但如果您无法修改数据库,您只需要在代码中完成您的工作。我想删除一篇新闻文章只发生在你的代码中的一个地方,对吧?如果没有,那就更好了。先解决这个问题。然后只需确保以适当的顺序删除所有适当的行。然后记录下来!

于 2010-07-26T07:43:12.120 回答
0

如果您无法更改架构,则触发器不是一个选项。

InnoDB 支持transactions,所以从两个表中删除应该不是问题,你到底是什么问题?

PS 值得注意的是您使用的是哪个版本的服务器。

于 2010-07-26T07:42:27.843 回答