我有一个开发数据库,我会定期从 prod 数据库的数据转储中重建它。在进行初始重建后,我运行了一个清理脚本,它会做一些事情,特别是将所有电子邮件更改为开发地址,这样我们的客户就不会在我们开发时无意中收到垃圾邮件。这一直很好,直到我更改了我们的数据库的结构,以便每个客户可以拥有多封电子邮件,并且有一个独特的约束,不允许每个客户多次发送同一封电子邮件。现在我正在尝试重写我的清理脚本以将所有电子邮件更改为“xyzpdq@abc.com”,但由于唯一约束它失败了。
出于明显的原因,我不想删除我的开发数据库上的唯一约束。我需要找出一种方法来为拥有多个联系人的客户分配虚假但独特的电子邮件。
这是我的数据结构:
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”的内容配置为全部来找我,但我不太乐观。