MYSQL, если не существует, вставить данные

Ребята, я получаю дубликаты записей при вставке в базу данных по какой-то причине с этим кодом

$qry = "INSERT IGNORE INTO reports (". implode(", ",array_keys($reports)) .") VALUES (". implode(", ",array_values($reports)) .");";
if(!mysql_query(trim($qry), $link)) { die('Error: ' . mysql_error()); }

Фактическое утверждение это

INSERT IGNORE INTO reports (`inspection_number`, `report_date`, `customer`) VALUES ('996', '10-21-2012', 'Jd Daniel');

БД теперь выглядит

19  NULL    NULL    NULL    996     NULL    0000-00-00  NULL    Jd Daniel   NULL    NULL    NULL    NULL
20  NULL    NULL    NULL    996     NULL    0000-00-00  NULL    Jd Daniel   NULL    NULL    NULL    NULL
21  NULL    NULL    NULL    996     NULL    0000-00-00  NULL    Jd Daniel   NULL    NULL    NULL    NULL
22  NULL    NULL    NULL    996     NULL    0000-00-00  NULL    Jd Daniel   NULL    NULL    NULL    NULL

я думал так INSERT IGNORE должен был игнорировать дубликаты? Что происходит?

РЕДАКТИРОВАТЬ Вот моя структура таблицы, я пытался использовать inspection_number как мой уникальный индекс для сравнения.

--
-- Table structure for table `reports`
--

DROP TABLE IF EXISTS `reports`;
CREATE TABLE `reports` (

    `key`                   INT UNSIGNED AUTO_INCREMENT, 
    `role`                  VARCHAR(70), 
    `region`                VARCHAR(70),
    `inspection_type`       VARCHAR(70),
    `inspection_number`     VARCHAR(70),
    `customer_number`       VARCHAR(70),

    `report_date`           DATE DEFAULT NULL,  -- Date field? Needs DATETIME instead? Needs DEFAULT NULL?
                                                -- Does this need to be created on upload,
                                                -- or is it uploaded from tablet?

    `order_date`            DATE DEFAULT NULL,  -- Date field? Needs DATETIME instead? Needs DEFAULT NULL?
                                                -- Ditto

    `customer`              VARCHAR(70),
    `customer_division`     VARCHAR(70),
    `location`              VARCHAR(70),
    `memo`                  VARCHAR(255),       -- Same as _comments? VARCHAR(255)??
    `billing_key`           VARCHAR(70),

    PRIMARY KEY(`key`)

) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

3 ответа

Решение

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

Во избежание дублирования данных в вашей таблице. вам нужно создать ПЕРВИЧНЫЙ КЛЮЧ на вашем столе. В этом примере ниже не будет разрешено более 1 строки с одним и тем же номером инспекционного номера

ПРИМЕР:

CREATE TABLE отчеты (
  inspe_number int(10) NOT NULL,
  отметка времени отчета,
  клиент VARCHAR(50),
  ПЕРВИЧНЫЙ КЛЮЧ (инспекционный номер));

INSERT IGNORE считает строку дубликатом, если она имеет тот же первичный ключ или уникальный индекс. Скорее всего ни одно из трех полей (inspection_number, report_date или же customer) являются первичными ключами или уникальными индексами.

Если вы не хотите дубликатов, вы можете использовать Replace команда вместо вставки.

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

Это попытается добавить значение, если обнаружит дубликат (из первичного ключа), удалит старый и вставит его снова.

Другие вопросы по тегам