Как добавить в таблицу MySQL только если запись еще не существует? - PullRequest
1 голос
/ 11 июня 2009

Я получаю массив строк из объекта JSON. Я хочу сохранить эти строки в БД, но только если их там нет. Какой лучший способ сравнить то, что уже находится в БД, с тем, что я собираюсь ввести, и исключить совпадения?

Я использую PHP и MySQL.

Ответы [ 4 ]

5 голосов
/ 11 июня 2009

Поскольку вы описываете, что хотите оставить запись в покое, если строки уже существуют, вам, вероятно, понадобится модификатор IGNORE к INSERT (т.е. вы делаете INSERT IGNORE ...). Это заставит ваш запрос ничего не делать, если найден дубликат ключа. Это, конечно, требует, чтобы в строковых полях, в которые вы вставляете, были уникальные ключи.

3 голосов
/ 11 июня 2009

REPLACE может делать то, что вы хотите - он вставляет, но если первичный ключ уже существует, строка удаляется первой. Если вам не нужно сохранять другие столбцы в таблице, это должно работать.

http://dev.mysql.com/doc/refman/5.0/en/replace.html

2 голосов
/ 11 июня 2009

В MySql вы можете использовать оператор вставки с опцией ignore, который не будет вставлять строку, если ее уникальные поля совпадают с полями существующей строки. Таблица должна иметь ограничение уникальности с соответствующими полями.

0 голосов
/ 12 июня 2009

Очень простой пример:

Ваша таблица: пользователи Ваши поля: users_id, user_name, zip_code, созданы Уникальный индекс: user_name

INSERT INTO пользователей (user_name, zip_code, создан) ЦЕННОСТИ ( 'Джо', 75034, '2009-06-11') ON DUPLICATE KEY UPDATE users_id = LAST_INSERT_ID (id)

имя_пользователя имеет уникальный индекс; Таким образом, вы не можете добавить его более одного раза. Когда вы используете приведенный выше SQL, он будет добавлен в первый раз. Во второй раз он фактически не вставит. Способ установки ключа на дубликате теперь позволяет получить последний идентификатор вставки из mysql с помощью PHP и узнать, каким был user_id, была ли это настоящая вставка или дубликат.

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