描述:
id int(11),account_id int(11),email varchar(255),phone varchar(30),primary key(id),FOREIGN KEY (account_id) REFERENCES accounts (id)
此表包含不同帐户的记录,并且电子邮件可被视为对两个或多个帐户有效.这意味着电子邮件可以在表格中重复,但每个account_id只能显示一次.
我从Gmail导入了我的联系人(超过700个联系人,其他用户可能有更多).
挑战:
我可以选择运行两个查询(一个用于检查是否存在电子邮件或电话,第二个用于插入记录),每个记录在我的情况下是1,400个SQL查询,以便我能够插入所有导入的记录,确保每个记录都没有重复列表中的account_id.
我查看了MysqL IGnorE和类似的关键字,如ON DUPLICATE KEY UPDATE但它们似乎在这种情况下不起作用,因为我无法使电子邮件和电话列唯一,因为它们可能包含重复内容.
插入这700条记录的最佳方法是什么,确保每个account_id不重复电子邮件和电话,而不必运行1,400个查询?
问题更新:
我不认为INSERT IGnorE可以在此处使用以下原因:
>我不能发电子邮件和电话独特的列
>电话号码可能为空但有电子邮件条目,这可能会打破独特的模式
问题说明
我有两个办公室使用该表来存储他们的客户记录.有人可以成为两个办事处的客户.这意味着他的记录可以在表格中出现两次,但对于表格中的每个account_id只能出现一次.
现在的挑战是在表中插入几条记录,确保每条account_id都不重复记录.
解决方法
>对于一个给定的account_id,电子邮件必须是唯一的:
ALTER TABLE your_table ADD UNIQUE (account_id,email);
>对于一个给定的account_id,电话号码必须是唯一的:
ALTER TABLE your_table ADD UNIQUE (account_id,phone);
两个索引可能同时存在于您的表中.可能会引发“重复键冲突”错误,并会触发插入的IGnorE或ON DUPLICATE子句.
话虽如此,您的结构中存在问题.您即将复制客户与其共同使用的每个account_id的详细信息.
您应该有一个客户表,其中包含所有客户的联系详细信息(仅限于此),另一个帐户表 – 您的“办公室”,如果我理解正确 – 最后是一个关系表,用于在客户和帐户之间建模n-n relationship:
CREATE TABLE customers_accounts ( customer_id INT NOT NULL,account_id INT NOT NULL,PRIMARY KEY (customer_id,account_id),FOREIGN KEY (customer_id) REFERENCES customers(id) FOREIGN KEY (account_id) REFERENCES accounts(id) );