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。下面的这个例子不允许超过 1 行具有相同的inspection_number 编号

例子:

创建表报告(
  检查编号 int(10) 非空,
  report_date 时间戳,
  客户 VARCHAR(50),
  主键(inspection_number)
);
于 2012-02-16T18:28:05.143 回答
1

如果您不想要任何重复项,您可以使用该Replace命令而不是 Insert 。

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

这将尝试添加该值,如果检测到重复项(来自主键)将删除旧的并再次插入。

于 2012-02-16T18:19:18.400 回答
1

INSERT IGNORE如果具有相同的主键或唯一索引,则认为行重复。很可能这三个字段(inspection_numberreport_datecustomer都不是主键或唯一索引。

于 2012-02-16T18:21:57.353 回答