2012-02-16 105 views
4

家伙我得到的插入重复记录到我的数据库由于某种原因,这个代码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'); 

DB现在看起来像

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; 
+1

这也可能是有用的:http://stackoverflow.com/questions/548541/insert-ignore-vs -insert-on-duplicate-key-update – Dan 2012-02-16 18:19:56

+0

除此之外,它还会导致主键违例被视为警告。因此,如果19,22恰好是一个汽车公司,例如,没有重复... – 2012-02-16 18:24:22

+1

但结构说'inspection_number'是*不*唯一索引? – JJJ 2012-02-16 18:39:47

回答

1

INSERT IGNORE将尝试将记录插入表中,并忽略数据库引擎中的重复错误,以便脚本不会无法继续。

为了避免您的表中有重复的数据。你需要在你的桌子上创建一个PRIMARY KEY。本实施例中以下将不允许超过1行具有相同数量inspection_number

实施例:

 
CREATE TABLE reports (
    inspection_number int(10) NOT NULL, 
    report_date  timestamp, 
    customer   VARCHAR(50), 
    PRIMARY KEY(inspection_number) 
); 
+0

我已更新我的代码以显示数据库结构。 – ehime 2012-02-16 18:32:36

1

如果你不希望任何重复的,你可以使用Replace命令,而不是插入。

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

这将尝试添加的值,如果检测到重复的(从主键)将删除旧的,然后重新插入。

+0

这似乎并没有插入? 'REPLACE INTO reports('inspection_number','report_date','customer')VALUES('996','10 -21-2012','Jd Daniel');'有什么问题? – ehime 2012-02-16 18:24:05

+0

你需要一个主键在其他方面,它会简单地添加值。请参阅文档“请注意,除非表具有PRIMARY KEY或UNIQUE索引,否则使用REPLACE语句没有任何意义,因为没有要用于确定新行是否重复另一个索引的索引,因此它与INSERT等效。 – 2012-02-16 18:26:59

+0

可能是一个愚蠢的问题,但我可以在创建表时使用'UNIQUE INDEX('inspection_number')'吗? – ehime 2012-02-16 18:38:53

1

INSERT IGNORE认为行重复,如果它具有相同的主键或唯一索引。最有可能三个字段(inspection_number,report_datecustomer)都不是主键或唯一索引。

相关问题