Union 2表内连接第三个带有2个遗留应用程序

时间:2012-10-24 16:28:29

标签: mysql sql

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

我正在安装到我的网络应用程序中的新模块附带了它自己的一组表格。它将很乐意存在于同一个数据库中,但想要它自己的表中的数据副本。我毫不犹豫地广泛修改该模块的新表或代码库。

总共有6个表包含旧数据库中不同对象的类似数据。我现在只处理这两个表中最重要的两个表。以下仅表示这两个表中列的一小部分。

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'

旧版访问应用程序更新代理和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?

1 个答案:

答案 0 :(得分:0)

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

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

触发器也可以。