【发布时间】:2012-04-23 21:57:12
【问题描述】:
当我从用户那里接收数据时,我每次都会验证输入的格式 (PHP)。我唯一无法验证(或者我不想)是约束(例如外键)违规。我让 DML 引发错误并让数据库驱动程序引发异常。捕捉到它后,我只是通过 MySQL 的错误代码打印出一些错误消息。
问题是,即使插入失败,我看到autoincrement 序列仍在增长,增加。我怎样才能防止这种情况发生?
【问题讨论】:
-
理想情况下,如果数据无效,您根本不会在 DB 级别触发
INSERT。原因是每当从 DB 序列中选择下一个 ID 时,序列就会自动获得下一个值,即我们看到“自动增量”增长。但这是正确的(和预期的)行为。因此,我建议在访问数据库之前检查/清理您的数据。 (这只是评论而不是答案)。 -
是否对每个表使用来自 PHP 实体的 SFW 查询进行几个外键约束检查,而不是只访问一次数据库并让它处理违规行为?我的意思是,当您有 5 个约束要检查时,这意味着 5 个
SELECT并从 PHP 实体进行测试。 (闻起来像我的开销。) -
我同意额外查询造成的“开销”。然而,由于它们是 FK(即 ID 字段),它们应该针对索引(通常为 FK 约束/ID 自动创建)运行,在某些情况下(取决于流量/使用情况/索引大小)只是保存在内存中。取决于你的具体情况。就个人而言,当我使用 ORM 时,我会在插入新的/更新的相关实体之前从数据库中获取相关对象(通过 FK,即索引查找),因此不必自己处理序列生成的 ID。
标签: mysql sql auto-increment