我有一个像这样设计的标签系统:
CREATE TABLE `tag` (
`tag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`user_id` bigint(20) NOT NULL,
`add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`tag_id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0;
CREATE TABLE `user` (
`user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0;
tag.user_is
是一个外键,每个用户都可以创建新标签(如果是新标签)(之前没有创建过用户)。我在这里使用PDO提交方法的问题,它在第一次出现行时停止并返回此错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'restaurant' for key 'name'
那么,有没有办法告诉PDO引擎即使出现错误也能继续提交?
<?php
$db->beginTransaction();
for ($i = 0; $i < count($tags); ++$i)
{
$db->execute('INSERT INTO tag(name, user_id) VALUES('.$db->quote($tags[$i]).','.$user_id.')')
}
$db->commit();
?>
答案 0 :(得分:0)
如果您需要在replace into
字段上维护唯一约束,为什么不将您的查询编写为insert ... on duplicate key update
,insert
或类似的内容而不是name
?我认为忽略你的错误通常不是一个好主意。