2013-06-26 3 views
0

Я пытаюсь выбрать элементы из той же таблицы, повторно организовать данные, а затем вставить данные в ту же таблицу, что и новые записи (в основном я беру " A "для DNS и преобразования их в записи" PTR ").MySQL: INSERT INTO SELECT FROM с некоторыми уникальными значениями

Проблема заключается в том, что я не хочу создавать записи, если существуют три столбца - так что в принципе, если все три столбца существуют (и все они должны существовать, потому что, если только один не соответствует, то он должен быть вставлен в базу данных), то я хочу, чтобы MySQL не вставлял его.

Вот таблица:

mysql> describe records; 
+-------------+----------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+----------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| domain_id | int(11)  | YES | MUL | NULL |    | 
| name  | varchar(255) | YES | MUL | NULL |    | 
| type  | varchar(10) | YES |  | NULL |    | 
| content  | varchar(64000) | YES |  | NULL |    | 
| ttl   | int(11)  | YES |  | NULL |    | 
| prio  | int(11)  | YES |  | NULL |    | 
| change_date | int(11)  | YES |  | NULL |    | 
+-------------+----------------+------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

Следующая SQL я смог работать, и он работает, только без проверки трех других месторождений, «уникальный»:

INSERT INTO records (domain_id,name,type,content,ttl,prio,change_date) SELECT domain_id AS domain_id, substring_index(content, '.', -1) AS name, 'PTR' AS type, concat(`name`, '.') AS content, ttl AS ttl, prio AS prio, unix_timestamp() AS change_date from records where type='A' 

В основном единственное, что здесь отсутствует, это то, что если domain_id, name и content ALL существуют в другой строке (на основе текущей вставки), я хочу, чтобы она пропускала эту единственную вставку и переходила к следующей вставке, потому что я не хочу того же записей в базе данных.

ответ

0

Просто добавьте условие о существовании таких строк в предложении where. Например:

INSERT INTO records (domain_id,name,type,content,ttl,prio,change_date) SELECT domain_id AS domain_id, substring_index(content, '.', -1) AS name, 
'PTR' AS type, concat(`name`, '.') AS content, ttl AS ttl, prio AS prio, unix_timestamp() AS change_date from records a where type='A' 
and not exists (select * from records b where a.domain_id = b.domain_id and a.name = b.name and a.content = b.content) 
+0

К сожалению, это также не работает. – drewrockshard

0

ли присоединиться к ЛЕВЫЙ против стола на основе 3-х полей, которые вы хотите проверить (полагаю, вы заинтересованы только в существующих полей типа PTR), и выбрать только записи является не матч : -

INSERT INTO records (domain_id,name,type,content,ttl,prio,change_date) 
SELECT a.domain_id AS domain_id, 
    substring_index(a.content, '.', -1) AS name, 
    'PTR' AS type, 
    concat(a.`name`, '.') AS content, 
    a.ttl AS ttl, 
    a.prio AS prio, 
    unix_timestamp() AS change_date 
FROM records a 
LEFT OUTER JOIN records b 
ON a.domain_id = b.domain_id 
AND a.name = b.name 
AND a.content = b.content 
AND b.type = 'PTR' 
WHERE b.id IS NULL 
AND a.type = 'A' 
+0

Это не работает - оно берет все в базе данных, а затем создает его, если оно существует. – drewrockshard

+0

Этого не должно делать. Он выбирает из записей как a, чтобы получить все существующие записи типа A и присоединяется к ним как записи с помощью LEFT JOIN, проверяя тип записи b для PTR. Любой, где найден b-запись, игнорируется – Kickstart

+0

Kickstart: У меня есть 40 строк данных, и каждый раз, когда я запускаю этот оператор, он добавляет еще 40, поэтому он не делает что-то правильно. – drewrockshard