首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除主行和所有子mysql和php

删除主行和所有子mysql和php
EN

Stack Overflow用户
提问于 2010-07-26 15:32:20
回答 3查看 720关注 0票数 1

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

任何帮助都将是非常有帮助的我很抱歉我不能给你更多的帮助,这是原始的SQL of tables方案吗?

代码语言:javascript
复制
    --
-- 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,以便可以使用外键。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-26 15:41:43

将外键添加到表mailer_content

代码语言:javascript
复制
FOREIGN KEY (mailer_id)
REFERENCES mailers(id)
ON DELETE CASCADE

将外键添加到表mailer_images

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2010-07-26 15:43:12

值得注意的是,模式不能更改,也不能更改为DB to MYISAM,以便可以使用外键。

为什么不能更改模式?这个应用是你设计的,不是吗?即使没有,添加正确的键也只需要添加正确的索引,然后更改正确的列。@Michael Pakhantosv的答案看起来是正确的SQL。

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

如果您可以更改模式,那么将适当的ID设为实际的、真实的外键并使用ON DELETE CASCADE将会起作用。或者是触发器。但这只是自找的。

现在,出于某些原因,在这里,ON DELETE CASCADE不是很受欢迎。我不同意别人不喜欢它的理由,但我不反对他们的观点。除非您的应用程序设计为在DELETE CASCADE上摸索,否则您会遇到很多麻烦。

但是,考虑到你的要求...

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

..。这是对删除级联的要求。

所以,这可能会让人震惊,但是如果你不能修改数据库,你只能在代码中完成你的工作。我可以想象一下,删除新闻文章只发生在代码中的一个位置,对吧?如果不是,最好是这样。先解决这个问题。然后,只需确保以适当的顺序删除所有适当的行。然后将其记录下来!

票数 1
EN

Stack Overflow用户

发布于 2010-07-26 15:42:28

如果您不能更改模式,那么triggers就不是一个选项。

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

附注:值得注意的是,您使用的是哪种版本的服务器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3332988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档