我继承了一个PHP项目,客户想要添加一些功能到他们的CMS,基本上CMS允许他们创建一些新闻,所有的新闻从相同的内容开始,保存在一个表中,实际新闻标题和文章保存在另一个表中,新闻的图像保存在另一个表中,基本上如果新闻的基本行被删除,我需要删除所有相关的行,数据库没有设置为使用外键所以我不能使用级联删除,那么当我只删除基本新闻行的ID时,我如何删除我需要的所有内容?
任何帮助都将是非常有帮助的我很抱歉我不能给你更多的帮助,这是原始的SQL of tables方案吗?
--
-- 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 ;值得注意的是,模式不能更改,也不能更改为DB to MYISAM,以便可以使用外键。
发布于 2010-07-26 15:41:43
将外键添加到表mailer_content
FOREIGN KEY (mailer_id)
REFERENCES mailers(id)
ON DELETE CASCADE将外键添加到表mailer_images
FOREIGN KEY (content_id)
REFERENCES mailer_content(id)
ON DELETE CASCADEhttp://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
发布于 2010-07-26 15:43:12
值得注意的是,模式不能更改,也不能更改为DB to MYISAM,以便可以使用外键。
为什么不能更改模式?这个应用是你设计的,不是吗?即使没有,添加正确的键也只需要添加正确的索引,然后更改正确的列。@Michael Pakhantosv的答案看起来是正确的SQL。
此外,执行外键的是InnoDB,而不是MyISAM。你已经很好了。
如果您可以更改模式,那么将适当的ID设为实际的、真实的外键并使用ON DELETE CASCADE将会起作用。或者是触发器。但这只是自找的。
现在,出于某些原因,在这里,ON DELETE CASCADE不是很受欢迎。我不同意别人不喜欢它的理由,但我不反对他们的观点。除非您的应用程序设计为在DELETE CASCADE上摸索,否则您会遇到很多麻烦。
但是,考虑到你的要求...
基本上,如果新闻的基本行被删除,我需要删除所有相关行
..。这是对删除级联的要求。
所以,这可能会让人震惊,但是如果你不能修改数据库,你只能在代码中完成你的工作。我可以想象一下,删除新闻文章只发生在代码中的一个位置,对吧?如果不是,最好是这样。先解决这个问题。然后,只需确保以适当的顺序删除所有适当的行。然后将其记录下来!
发布于 2010-07-26 15:42:28
https://stackoverflow.com/questions/3332988
复制相似问题