1

私はPHPプロジェクトを継承しており、クライアントはCMSにいくつかの機能を追加したいと考えています。基本的に、CMSを使用するとニュースを作成でき、すべてのニュースは同じコンテンツで始まり、実際のニュースの見出しである1つのテーブルに保存されます。記事は別のテーブルに保存され、ニュースの画像は別のテーブルに保存されます。基本的に、ニュースのベース行が削除された場合、関連するすべての行を削除する必要があります。データベースは外部キーで機能するように設定されていません。カスケード削除を使用できないので、ベースニュース行の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 ;

スキーマを変更することも、外部キーを使用できるようにDBをMYISAMに変更することもできないことに注意してください。

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

スキーマを変更することも、外部キーを使用できるようにDBをMYISAMに変更することもできないことに注意してください。

スキーマを変更できないのはなぜですか?あなたはアプリをデザインしましたね?そうしなかったとしても、適切なキーを追加するには、適切なインデックスを追加してから、適切な列を変更するだけです。@Michael Pakhantosvの答えには、SQLの正しい部分のように見えるものがあります。

さらに、MyISAMではなく外部キーを実行するのはInnoDBです。もう元気です。

スキーマを変更できれば、適切なIDを実際の実際の外部キーにし、ONDELETECASCADEを使用すると機能します。または多分トリガー。しかし、それはただそれを求めているだけです。

さて、どういうわけか、ONDELETECASCADEはこの辺りではあまり好きではありません。私は他の人がそれを好まない理由に同意しませんが、彼らの感情には同意しません。アプリケーションがDELETECASCADEを実行するように設計されていない限り、問題が発生します。

しかし、あなたの要件を考えると...

基本的に、ニュースのベース行が削除された場合、関連するすべての行を削除する必要があります

...それはONDELETECASCADEを求めています。

したがって、これはショックになる可能性がありますが、データベースを変更できない場合は、コードで作業を行う必要があります。ニュース記事の削除は、コード内の1か所でのみ発生すると思いますよね?そうでない場合は、それが良いでしょう。最初にそれを修正してください。次に、適切な順序ですべての適切な行を削除するようにしてください。そしてそれを文書化します!

于 2010-07-26T07:43:12.120 に答える
0

スキーマを変更できない場合、トリガーはオプションではありません。

InnoDBはトランザクションをサポートしているので、2つのテーブルからの削除は問題にならないはずですが、あなたの問題は正確には何ですか?

PS使用しているサーバーのバージョンに注意する価値があります。

于 2010-07-26T07:42:27.843 に答える