跳轉到內容

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
華夏公益教科書