簡體   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