prodデータベースのデータダンプから定期的に再構築するdevデータベースがあります。最初の再構築を行った後、いくつかのことを実行するクリーンアップスクリプトがあります。特に、開発時にすべての電子メールを開発者アドレスに変更して、顧客が不注意にスパムを送信しないようにします。これは、dbの構造を変更して、各顧客が複数の電子メールを持つことができるようにするまでは正常に機能しました。固有の制約により、顧客ごとに同じ電子メールを複数回許可することはできませんでした。現在、クリーンアップスクリプトを書き直して、すべての電子メールを「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:これまでのアイデアに感謝します。私が省略したことの1つは、現在すべてに設定している偽のアドレスが実際に私に届くので、テスト中に電子メールを見ることができるということです。'dev- {contactemailid}@abc.com'のようなものをすべて私に届くように構成できるかどうか、私はopsグループに尋ねていますが、私はあまり楽観的ではありません。