我有一个dev数据库,我定期从prod数据库的数据转储中重建该数据库。在完成初始重建后,我运行了一个清理脚本,该脚本做了一些事情,特别是将所有电子邮件更改为开发地址,这样我们的客户在开发时就不会无意中收到垃圾邮件。这很好用,直到我改变了我们数据库的结构,每个客户可以有多个电子邮件,有一个唯一的约束,不允许每个客户多次使用相同的电子邮件。现在我正在尝试重写我的清理脚本,将所有电子邮件更改为"xyzpdq@abc.com“,但由于唯一的约束,它失败了。
由于显而易见的原因,我不想删除对我的dev db的唯一约束。我需要想出一种方法来分配假的,但独特的电子邮件给有多个联系人的客户。
下面是我的数据结构:
CREATE TABLE contact (
contactid decimal(22,0) DEFAULT '0' NOT NULL,
...,
PRIMARY KEY (contactid)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE contact_email (
contactemailid decimal(22,0) DEFAULT '0' NOT NULL,
contactid decimal(22,0) DEFAULT '0' NOT NULL,
emailaddress varchar(255) COLLATE latin1_bin NOT NULL,
PRIMARY KEY (contactemailid),
CONSTRAINT ce_contactid_fk FOREIGN KEY (contactid) REFERENCES contact (contactid) ON DELETE NO ACTION ON UPDATE NO ACTION,
INDEX ce_contactid_fk (contactid),
CONSTRAINT ce_uniquecombokey UNIQUE KEY (contactid, emailaddress)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE merchant_contact (
merchantcontactid decimal(22,0) DEFAULT '0' NOT NULL,
merchantacctid decimal(22,0) DEFAULT '0' NOT NULL,
contactid decimal(22,0) DEFAULT '0' NOT NULL,
billingcontact tinyint(1) default '0' NOT NULL,
PRIMARY KEY (merchantcontactid),
CONSTRAINT mc_contactid_fk FOREIGN KEY (contactid) REFERENCES contact (contactid) ON DELETE NO ACTION ON UPDATE NO ACTION,
INDEX mc_contactid_fk (contactid),
CONSTRAINT mc_uniquecombokey UNIQUE KEY (merchantacctid, billingcontact)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;在我允许每个客户发送多封电子邮件之前,我的清理脚本的这一部分很简单:
update contact_email set emailaddress = 'xyzpdq@abc.com';现在由于约束,它失败了。我得到了一个Error Code: 1062, SQL State: 23000 (完整性约束冲突)。
有什么建议吗?提前谢谢。我将继续自己研究它,但希望有经验的SQL脚本编写人员能给我一些建议/想法。
ETA:谢谢你到目前为止的点子。我遗漏了一件事,那就是我当前设置的假地址确实会出现在我身上,所以我可以在测试时看到电子邮件。我正在询问我们的运维团队,是否可以将类似'dev-{contactemailid}@abc.com‘这样的东西配置为所有人都来找我,但我不太乐观。
发布于 2012-07-30 23:41:21
update contact_email set emailaddress = CONCAT(contactemailid, 'xyzpdq@abc.com')https://stackoverflow.com/questions/11724733
复制相似问题