MySQL автоматически предотвращает избыточные вставки - PullRequest
1 голос
/ 21 декабря 2010

У меня есть таблица типа

create table adjacencies(
  relationId int not null primary key auto_increment,
  parent int not null,
  child int not null,
  pathLen int not null
) ;

Я вставляю большое количество записей, таких как

insert into adjacencies( parent, child, pathLen )
select a, b, c from something where condition ;

Так что иногда, когда я запускаю запрос на вставку, возможно, что (parentДочернее) отношение уже будет существовать и будет продублировано.Плохие новости.

Я не хочу создавать первичный ключ для (родительский, дочерний), потому что это приводит к серьезному сбою (сбой запроса).

Мне нужен soft fail , если есть попытка вставить пару (родитель, потомок), которая уже существует в таблице (т. е. только эта пара получает игнорируется , а остальная часть запроса выполняется нормально).

Какой лучший способ сделать это в MySQL?

(* Wondering Почему в этой таблице есть член RelationsId? )

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Создайте составной уникальный ключ вокруг родительского и дочернего столбцов.Затем выполните запрос, подобный следующему:

insert ignore into adjacencies( parent, child, pathLen )
select a, b, c from something where condition ;

Предложение IGNORE превратит повторяющиеся ошибки ключа в предупреждения.

1 голос
/ 21 декабря 2010

Используйте

INSERT IGNORE ...

и создайте уникальный индекс / первичный ключ

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения.Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор прерывается.С IGNORE строка все еще не вставлена, но ошибка не выдана.

(с) http://dev.mysql.com/doc/refman/5.1/en/insert.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...