检查条目是否存在而不是插入mysql

时间:2013-12-20 17:15:49

标签: mysql

我正在从导入的表中进行插入,并使用mysql将数据添加到多个表中。

基本上,在执行插入操作时,由于数据已从csv导入,因此存在一些空字段。

我想要做的是提取数据而不是创建多个空条目。一个例子是添加没有条目的联系人。基本上我想在表中有一个条目,可以绑定到表中的id。

我该怎么做?

我目前的代码是

Insert into Contact(FirstName, Surname, Position, TelephoneNo, EmailAddress, RegisteredDate)

Select Distinct Import.FirstName, Import.SecondName, Import.JobTitle, 
                Import.ContactTelNumber, Import.EmailAddress, Import.RegistrationDate
FROM Import

这基本上是导入并且没有检查,但我可以在哪里添加检查?

1 个答案:

答案 0 :(得分:1)

很难从描述中准确地推断出你的意思。如果您展示了几个示例行,一个是您想要包含的行,另一个是您想要被排除的行,这将有所帮助。

但是您可以在SELECT的WHERE子句中添加各种条件。例如,如果您只想确保Import中的至少一列非空,则可以执行以下操作:

INSERT INTO Contact(FirstName, Surname, Position, TelephoneNo, 
  EmailAddress, RegisteredDate)

SELECT DISTINCT FirstName, SecondName, JobTitle, 
                ContactTelNumber, EmailAddress, RegistrationDate
FROM Import
WHERE COALESCE(FirstName, SecondName, JobTitle, ContactTelNumber, 
  EmailAddress, RegistrationDate) IS NOT NULL

COALESCE()是一个接受可变数量参数的函数,并返回第一个非null参数。如果所有参数都为null,则返回null。因此,如果我们合并所有列,并且我们得到一个null,那么我们知道所有列都是null,我们排除该行。


重新评论:

好的,听起来你想在整行上有一个唯一的约束,并且你只想复制那些不违反唯一约束的行。

实现此目标的一种方法如下:

ALTER TABLE Contact ADD UNIQUE KEY (FirstName, Surname, Position, TelephoneNo, 
  EmailAddress, RegisteredDate);

INSERT IGNORE INTO Contact(FirstName, Surname, Position, TelephoneNo, 
  EmailAddress, RegisteredDate)

SELECT DISTINCT FirstName, SecondName, JobTitle, 
                ContactTelNumber, EmailAddress, RegistrationDate
FROM Import;

INSERT IGNORE表示如果遇到类似重复行的错误,请不要插入它,也不要中止其他行的插入。

唯一约束会创建一个索引,因此运行该ALTER TABLE需要一些时间,具体取决于表的大小。

使用包含许多列的键可能也是不切实际的。索引的长度限制为16列和1000字节。但是,我希望你真正想要的是每个EmailAddress或列的其他一些子集限制为一行。