1

我有一个连接到 mySQL 数据库的旧式 Access 前端。旧版应用程序有很多危险的宏分配给 onclose 触发器。我还有一个正在开发中的 Web 应用程序在同一个数据库上运行。Web 应用程序中有几个模块正在生产中使用。我的测试是在单独的开发机器上完成的,该机器具有单独的专用开发版本的数据库。

我正在安装到我的网络应用程序中的一个新模块带有它自己的一组表。它会很高兴地存在于同一个数据库中,但想要它自己的表中的数据副本。我犹豫是否要广泛修改该模块的新表或代码库。

共有 6 个表保存旧数据库中不同对象的相似数据。我现在只处理其中最重要的两张表。下面仅代表这 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 ;

新模块附带了几个相关的表格。我相信只有其中一个需要更新。

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 手册说联合和连接破坏了它的更新能力。http://dev.mysql.com/doc/refman/5.1/en/view-updatability.html

那么,有没有办法在不重复数据的情况下更新这 3 个表呢?或者我应该只是复制电子邮件地址并在 INSERT 和 UPDATE 上使用 TRIGGER?

4

1 回答 1

0

尽管外键更倾向于保持表一致而不是防止重复,但您可能可以用外键做一些聪明的事情。http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

这可能看起来违反直觉,但另一种解决方案是维护一个查找表,该表指示可以找到特定值的位置。您可以加入所有三个(子)表以防止重复。

触发器也可以。

于 2012-10-24T17:04:51.020 回答