2015-08-27 5 views
1

У меня есть CSV-файлы, и мне нужно сделать что-то вроде этого, прежде чем вставлять данные в моей таблице:Проверьте запись существует

table fields 
id = primary id and auto-increment 
house_no 
city_code 
prv_code 
cty_code 


if (house_no,city_code,prv_code,cty_code) exists = ignore insert 
else if (house_no,city_code,prv_code,cty_code) is null = ignore insert 
else (house_no,city_code,prv_code,cty_code) !exist = insert 

Мой исходный код просто повторно вставляет то же значение, так как первичный ключ идентификатора просто создает для него новый идентификатор, и в результате у меня есть дубликаты.

Мне нужно сделать это, чтобы избежать дубликатов. Я пробовал INSERT IGNORE и , но мне нужен уникальный ключ, и все поля могут иметь одно значение (например, они могут иметь разные house_no, но то же самое prv_code или cty_code или что-то в этом роде). Я просто хочу проверить, существует ли запись, прежде чем вставлять ее.

+0

Я не уверен. Если я правильно вас понял, но почему бы вам не использовать «TRIGGER» для этого. Однако вы предоставили ограниченный объем информации. – mic4ael

ответ

1

Вы можете создать уникальный ключ более чем в одном столбце. В вашем случае вам нужен уникальный ключ, содержащий четыре столбца house_no, city_code, prv_code и cty_code.

В вашем случае:

ALTER TABLE fields 
ADD CONSTRAINT uc_fieldsUnique UNIQUE (house_no,city_code,prv_code, cty_code); 
0

Загрузка данных из CSV-файла во вторую таблицу, а затем использовать INSERT, как это добавить строки -

INSERT INTO t1(id, house_no, city_code, prv_code, cty_code) 
    SELECT NULL, t2.house_no, t2.city_code, t2.prv_code, t2.cty_code FROM t2 
    LEFT JOIN t1 ON t1.house_no = t2.house_no AND t1.city_code = t2.city_code AND t1.prv_code = t2.prv_code AND t1.cty_code = t2.cty_code 
     WHERE t1.id IS NULL 

(переименовать имена таблиц)

Смежные вопросы