MySQL/调试
外观
< 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。
从远程计算机连接时,使用的帐户未被授权。应该设置如下
GRANT ALL PRIVILEGES ON *.* TO 'MyUser1'@'%' WITH GRANT OPTION;
而不是或除了
GRANT ALL PRIVILEGES ON *.* TO 'MyUser1'@'localhost' WITH GRANT OPTION;
当尝试根据这些相同行的选择删除某些行时会发生这种情况。
只需使用一些中间 CREATE TEMPORARY TABLE
即可。
更改参数“host”。
- 在
SELECT
的情况下,使用HAVING
而不是WHERE
来根据某些其他记录修改记录。 - 对于
UPDATE
或DELETE
,IN
比较的字段可能不属于同一类型。
使用 phpMyAdmin 查找确切的语法错误位置。
将“IN”替换为一些连接。