伙计我因为某些原因使用此代码插入我的数据库时会出现重复记录
$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;
答案 0 :(得分:2)
INSERT IGNORE将尝试将记录插入表中,并忽略数据库引擎中的重复错误,以便您的脚本不会无法继续。
为了避免在表格中出现重复数据。你需要在桌子上创建一个PRIMARY KEY。下面的示例不允许使用相同的inspection_number编号
的行超过1行实施例
CREATE TABLE reports ( inspection_number int(10) NOT NULL, report_date timestamp, customer VARCHAR(50), PRIMARY KEY(inspection_number) );
答案 1 :(得分:1)
如果您不想要任何重复,可以使用Replace
命令而不是Insert。
http://dev.mysql.com/doc/refman/5.0/en/replace.html
这将尝试添加该值,如果检测到重复(从主键)将删除旧的并重新插入。
答案 2 :(得分:1)
INSERT IGNORE
如果具有相同的主键或唯一索引,则认为行重复。很可能三个字段(inspection_number
,report_date
或customer
)都不是主键或唯一索引。