1

mySQL データベースに接続された従来の Access フロント エンドがあります。レガシ アプリには、onclose トリガーに割り当てられた多くの危険なマクロがあります。同じデータベースで実行中の開発中の Web アプリケーションもあります。Web アプリには、運用環境で使用されているモジュールがいくつかあります。私のテストは、データベースの別の専用開発バージョンを備えた別の開発マシンで行われています。

Web アプリにインストールする新しいモジュールには、独自のテーブル セットが付属しています。喜んで同じデータベースに存在しますが、独自のテーブル内のデータの独自のコピーが必要です。そのモジュールの新しいテーブルまたはコード ベースを大幅に変更することを躊躇します。

レガシー データベースには、さまざまなオブジェクトの類似データを保持する合計 6 つのテーブルがあります。現在、これらのテーブルの中で最も重要な 2 つのテーブルのみに取り組んでいます。以下は、これら 2 つのテーブルの列の非常に小さなサブセットのみを表しています。

CREATE TABLE IF NOT EXISTS `agent` (
`age_id` int(11) NOT NULL AUTO_INCREMENT,
`age_agent_email_address` varchar(255) DEFAULT NULL,
`age_welcome_email_sent_y_or_n` varchar(255) DEFAULT 'No',
`age_status` varchar(255) DEFAULT 'Active',
PRIMARY KEY (`age_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1854 ;

CREATE TABLE IF NOT EXISTS `prospecting_contacts` (
`psp_prospect_id` varchar(255) NOT NULL DEFAULT '',
`psp_prospecting_status` varchar(255) DEFAULT 'Active',
`psp_prospect_email_address` varchar(255) DEFAULT NULL,
`psp_remove_from_email_marketing` varchar(255) DEFAULT 'No',
`psp_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`psp_id`) USING BTREE,
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2050793 ;

新しいモジュールに付属するいくつかの関連テーブルがあります。そのうちの 1 つだけを更新する必要があると思います。

CREATE TABLE IF NOT EXISTS `phplist_user_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) CHARACTER SET latin1 NOT NULL,
`confirmed` tinyint(4) DEFAULT '0',
`blacklisted` tinyint(4) DEFAULT '0',
`bouncecount` int(11) DEFAULT '0',
`entered` datetime DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`uniqid` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`htmlemail` tinyint(4) DEFAULT '0',
`subscribepage` int(11) DEFAULT NULL,
`rssfrequency` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`password` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`passwordchanged` date DEFAULT NULL,
`disabled` tinyint(4) DEFAULT '0',
`extradata` text CHARACTER SET latin1,
`foreignkey` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`optedin` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
KEY `foreignkey` (`foreignkey`),
KEY `idx_phplist_user_user_uniqid` (`uniqid`),
KEY `emailidx` (`email`),
KEY `enteredindex` (`entered`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

php_list_user_user テーブルには、このクエリの結果であるデータが含まれます。

SELECT `age_agent_email_address` AS `email` FROM `agent` 
    WHERE `age_status` = 'Active'
UNION DISTINCT
SELECT `psp_prospect_email_address` FROM `prospecting_contacts`
    WHERE `psp_prospecting_status` = 'Active'

レガシー アクセス アプリケーションは、agent テーブルとprospecting_contacts テーブルを更新します。新しいモジュールは、php_list_user_user テーブルを更新します。TRIGGER を使用して、情報を前後にコピーできると思います。しかし、データを複製しない方法を探しています。

私は CREATE VIEW を考えていましたが、mysql のマニュアルによると、union と join はその更新機能を壊すと書かれています。http://dev.mysql.com/doc/refman/5.1/en/view-updataability.html

では、データを複製せずにこれら 3 つのテーブルを更新する方法はありますか? それとも、電子メール アドレスを複製して、INSERT と UPDATE で TRIGGER を使用する必要がありますか?

4

1 に答える 1

0

外部キーは、重複を防ぐよりもテーブルの一貫性を維持することに慣れていますが、外部キーを使用して何か賢いことができるかもしれません。http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

直感に反するように思えるかもしれませんが、別の解決策は、特定の値がどこにあるかを示すルックアップ テーブルを維持することです。重複を防ぐために、3 つの (サブ) テーブルすべてを結合できます。

トリガーも機能します。

于 2012-10-24T17:04:51.020 に答える