我正在使用mySQL开发基于Web的应用程序,我过去曾使用它。在开发过程中,我从未见过mySQL错误 - 即。形式不佳的选择 - 但一旦它“工作”会出现什么样的错误?
我从未见过插入或选择失败 - 可以吗?如果语法正确,为什么会这样?
我大多问这个问题,目的是弄清楚如果错误确实发生了该怎么办。如果插入/更新失败,我会睡一秒再试一次吗?选择怎么样?在放弃之前多少次?
编辑: 也许我对此问得很糟糕,我正在寻找的是“如果我们出现问题,我应该如何处理我的SQL错误?”。在每个样本中,我都看到它只是死了 - 在一个看似非常难看的公共应用程序中。是否值得在几秒钟内重试该命令,然后向用户发送错误并通过电子邮件发送给管理员?或者只是接受致命错误无法修复。
答案 0 :(得分:3)
可能像某人关闭MySQL服务器一样简单
可能在MySQL服务器上设置了限制,例如MAX_QUERIES_PER_HOUR。
服务器断开与客户端的连接(流行的CR_SERVER_LOST)可能会出现错误或超时
数据(文件)可能已损坏,您可能会注意到,直到对数据库/表的查询运行为止
您的测试环境可能永远不会遇到“数据包太大”的情况,但随后您的生产服务器会这样做
还有很多......阅读http://dev.mysql.com/doc/refman/5.1/en/problems.html
答案 1 :(得分:3)
以下是一些错误示例,即使SQL语句在语法上正确且可能在您的开发环境中有效,也可能发生错误:
INSERT
或UPDATE
的 Duplicate key violation。也就是说,PRIMARY KEY
或UNIQUE KEY
会阻止您将列设置为另一行中的相同值。睡眠不太可能解决这个问题,您需要更改正在插入/更新的值。
Constraint violations,例如未满足的foreign key引用或将NOT NULL
列设置为NULL。您需要使用不违反约束的值插入/更新。删除具有外键依赖项的行会导致错误,除非您在FK约束声明中定义了级联行为。使用超出列数据类型范围的值插入或更新也是错误。
SQL privileges可以限制您可以执行的操作。
SELECT
可能会出错,并且它生成的查询存在缺陷。
如果有人将MySQL SQL MODE
更改为更严格,那么之前有效的查询可能会出错。例如,GROUP BY
查询中的单值规则的某些隐式数据类型转换或许可强制执行可能会失败。
答案 2 :(得分:0)
这完全取决于您对项目进行编码的方式。选择是否会失败将取决于您在代码中执行选择的方式。您是否正确清理了数据?因为这是关于MySQL和PHP的,它会带来有关您的服务器,配置,环境等的问题。
潜在问题有很多途径。如果不首先知道如何设置它,那么这个问题真的无法回答。其他可能包括太多的开放连接,持续时间过长的查询,缓存限制,死锁等。潜在问题太多,无法在此详尽列出。
也许你应该回答更多关于如何避免sql注入,清理数据,处理复杂查询等问题的具体问题。这里的社区很快会提供高质量的回复。我很有信心。