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
Это попытается добавить значение, если обнаружит дубликат (из первичного ключа), удалит старый и вставит его снова.