跳转到内容

MySQL/调试

来自维基教科书,自由的教科书

日志记录

[编辑 | 编辑源代码]

有几种方法可以调试 MySQL 脚本。例如,可能需要记录每个 SQL 请求。为此

 SET GLOBAL general_log = 'ON';
 SET GLOBAL log_output = 'TABLE';

然后它会将服务器的每个请求记录到系统数据库 mysql 中的 general_log 表中。

异常处理

[编辑 | 编辑源代码]

在 MySQL 中,像“被零除”这样的异常不会返回任何错误,而是返回 NULL。

但是,在操作表时可能会发生一些异常,例如为了避免由于“UNIQUE”约束导致插入列表在中途停止。以下示例函数在 InnoDB 表(而不是 MyISAM)上运行[1]

ALTER TABLE `MyTable1` ADD UNIQUE(`id`);

INSERT INTO MyTable1 (id) VALUES('1');
START TRANSACTION;
      INSERT INTO MyTable1 (id) VALUES('2');
      INSERT INTO MyTable1 (id) VALUES('3');
      INSERT INTO MyTable1 (id) VALUES('1');
IF condition THEN
  COMMIT;
ELSE
  ROLLBACK;
END IF;

在这里,在插入第二个 id=1 时会发生错误。但是根据一个条件,脚本可以取消 2 和 3 的插入,或者无论如何提交它们。

默认情况下,MySQL 设置为自动提交,这意味着在每个操作之后都会自动执行 COMMIT(使 ROLLBACK 无用)。要停用它,请启动 SET autocommit = 0;

注意:当在执行一个 ROLLBACK 之前执行多个 COMMIT 时(例如在循环中),它只会取消最后一个 COMMIT 之后的 operations。

1130: 主机 'example.com' 不允许连接到此 MySQL 服务器

[编辑 | 编辑源代码]

从远程计算机连接时,使用的帐户未被授权。应该设置如下

GRANT ALL PRIVILEGES ON *.* TO 'MyUser1'@'%' WITH GRANT OPTION;

而不是或除了

GRANT ALL PRIVILEGES ON *.* TO 'MyUser1'@'localhost' WITH GRANT OPTION;

1093 - 您不能在 FROM 子句中指定目标表 '...' 以进行更新

[编辑 | 编辑源代码]

当尝试根据这些相同行的选择删除某些行时会发生这种情况。

只需使用一些中间 CREATE TEMPORARY TABLE 即可。

2003: 无法连接到 MySQL 服务器

[编辑 | 编辑源代码]

更改参数“host”。

无效的组函数使用

[编辑 | 编辑源代码]
  • SELECT 的情况下,使用 HAVING 而不是 WHERE 来根据某些其他记录修改记录。
  • 对于 UPDATEDELETEIN 比较的字段可能不属于同一类型。

SQLSTATE[42000]: 语法错误或访问冲突

[编辑 | 编辑源代码]

使用 phpMyAdmin 查找确切的语法错误位置。

此版本的 MySQL 尚未支持 'LIMIT & IN/ALL/ANY/SOME 子查询'

[编辑 | 编辑源代码]

将“IN”替换为一些连接。

  1. http://stackoverflow.com/questions/2950676/difference-between-set-autocommit-1-and-start-transaction-in-mysql-have-i-misse
华夏公益教科书