2012-02-16 99 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)都不是主鍵或唯一索引。

相關問題