5

このコードを使用すると、何らかの理由でデータベースに挿入する際にレコードが重複します

$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;
4

3 に答える 3

3

INSERT IGNORE はレコードをテーブルに挿入しようとし、データベース エンジンからの重複エラーを無視して、スクリプトの続行に失敗しないようにします。

テーブルに重複データがないようにするため。テーブルに PRIMARY KEY を作成する必要があります。以下のこの例では、同じ Inspection_number 番号を持つ複数の行を許可しません

例:

CREATE TABLE レポート (
  Inspection_number int(10) NOT NULL,
  report_date タイムスタンプ、
  顧客 VARCHAR(50)、
  PRIMARY KEY(検査番号)
);
于 2012-02-16T18:28:05.143 に答える
1

INSERT IGNORE同じ主キーまたは一意のインデックスがある場合、行は重複していると見なされます。ほとんどの場合、3つのフィールド(inspection_number、、report_dateまたはcustomer)のいずれも主キーまたは一意のインデックスではありません。

于 2012-02-16T18:21:57.353 に答える
1

複製したくない場合はReplace、 Insert の代わりにコマンドを使用できます。

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

(主キーからの) 重複を検出すると古い値が削除され、再度挿入される場合、これは値を追加しようとします。

于 2012-02-16T18:19:18.400 に答える