繁体   English   中英

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

[英]Check if entry exists and not insert in 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

这基本上是导入的,不执行检查,但是在哪里可以添加检查呢?

很难从描述中确切地推断出您的意思。 如果显示了几个示例行,则希望有所帮助,其中一个要包括在内,另一个要被排除在外。

但是您可以在SELECT的WHERE子句中添加各种条件。 例如,如果您只想确保“导入”中的至少一列为非空,则可以这样做:

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。 因此,如果我们合并所有列,并且得到一个空值,那么我们知道所有列都为空,并且排除该行。


发表您的评论:

好的,听起来您想要在整个行上使用唯一约束,并且只想复制不违反唯一约束的行。

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

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限制为一行,或者限制为该列的其他子集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM