我该如何编写这个SQL脚本?

时间:2012-07-30 15:36:58

标签: mysql

我有一个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'这样的人来找我,但我不太乐观。

1 个答案:

答案 0 :(得分:2)

update contact_email set emailaddress = CONCAT(contactemailid, 'xyzpdq@abc.com')