Mysql

csv 導入失敗且未引發錯誤

  • January 14, 2022

我正在嘗試將 csv 文件導入現有mysql 5.7表。

這是命令(數據庫在 docker 中,帶有綁定掛載以實現持久性)

mysql -h 127.0.0.1 -uroot -prootpass --local_infile=1 jira_statistics -e "LOAD DATA LOCAL INFILE '/home/centos/bugs.csv' INTO TABLE bugs FIELDS TERMINATED BY ','"

然而:

mysql> select * from bugs;
Empty set (0.05 sec)

由於存在外鍵約束,無法載入該文件。我需要能夠擷取這樣的錯誤(以及可能發生的任何其他錯誤)作為退出程式碼,因為我將編寫大量這樣的導入腳本。

命令行沒有返回錯誤,dockerMySQL 容器的日誌顯示沒有錯誤。

更重要的是,該mysql命令的退出程式碼是0

有任何想法嗎?

封裝LOAD在一個儲存過程中。在那裡,擷取錯誤並將其公開給您的腳本。

但是,如果LOAD DATA不允許在儲存過程中使用,那麼您確實需要編寫應用程式碼,而不是依賴於線上 shell 腳本。

我無法得到mysql 返回的值,但是當由於某種原因無法將值插入列時,您可以通過將選項添加到命令行來%ERRORLEVEL%列印到控制台的警告。LOAD DATA LOCAL INFILE``--batch

我正在使用帶有 MySQL 8.0.22 的 Windows;這是我在 .cmd 文件中使用的測試命令:

@"C:\Program Files\MySQL\MySQL Workbench 8.0 CE\mysql.exe" --show-warnings --batch -h 127.0.0.1 -uxxx -pxxx --local_infile=1 test -e "LOAD DATA LOCAL INFILE '/temp/test.csv' INTO TABLE bugs FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';"
@ECHO %ERRORLEVEL%

/temp/test.csv我正在使用的包含:

1
二、測試
3
4

bugs

CREATE TABLE `bugs` (
 `i` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

執行批處理文件的輸出:

mysql: [Warning] Using a password on the command line interface can be insecure.
Warning (Code 1366): Incorrect integer value: 'two' for column 'i' at row 2
Warning (Code 1262): Row 2 was truncated; it contained more data than there were input columns
0

如您所見,出現了一條警告,告訴我們'two'無法將i. 該行也被截斷,因為沒有值“test”的列。

最後0一行是%errorlevel%值。

我嘗試將LOAD DATA命令添加到儲存過程中,以便為 SQL 異常創建退出句柄,但是 MySQL 阻止了LOAD DATA在儲存過程中的使用。這是錯誤:

錯誤程式碼:1314。儲存過程中不允許載入數據

引用自:https://dba.stackexchange.com/questions/229753