簡體   English   中英

Mariadb - 執行文件與將相同代碼粘貼到控制台之間的區別

[英]Mariadb - Diffferences between executing a file vs pasting same code into console

我正在嘗試從 SQL 服務器遷移到 Mariadb,但我遇到了很多有時讓我發瘋的小怪癖。 其中最主要的是從文件執行腳本和將其粘貼到控制台 window 之間的明顯差異。我習慣在 MSSQL 中使用選項卡格式化代碼,所以我仍在努力適應 Mariadb 中的選項卡行為控制台,但至少這是有道理的。 var 和@var 之間的區別對我來說也很奇怪。 下面的代碼在通過 Pycharm 執行時運行良好,但在粘貼到控制台 window 時失敗。我在 Pi Raspberry 上運行 Mariadb(@@版本:10.5.18-MariaDB-0+deb11u1),通過 SSH 從 48387481 訪問它11盒。

腳本所做的只是用來自美國人口普查數據的姓氏和男性/女性名字的隨機組合填充一個表以進行測試。 對錯誤的任何幫助將不勝感激。 我真的很想了解為什么粘貼和執行文件之間的區別。

設置@循環:= 10;

WHILE @loops > 0 DO INSERT person(last_name, first_name, iso_country) VALUES(census.random_name(0), census.random_name(FLOOR(1 + RAND() * (2 - 1 +1))), 'US') ; SET @loops:= @loops - 1; 結束時;

SELECT * 來自人;

ERROR 1064 (42000): 你的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本對應的手冊,了解在第 1 行的“END WHILE”附近使用的正確語法

我從運行良好的 Pycharm IDE 執行文件,並將相同的代碼粘貼到引發錯誤的 Mariadb 控制台,並且沒有發生插入。

mariadb 命令行客戶端有它自己的小型解析器,默認情況下分號被解釋為語句結束。

使用默認分隔符; 你的陳述在第一個分號之后被分成WHILE @loops > 0 DO INSERT person(last_name, first_name, iso_country) VALUES(census.random_name(0), census.random_name(FLOOR(1 + RAND() * (2 - 1 +1))), 'US'); SET @loops:= @loops - 1; WHILE @loops > 0 DO INSERT person(last_name, first_name, iso_country) VALUES(census.random_name(0), census.random_name(FLOOR(1 + RAND() * (2 - 1 +1))), 'US'); SET @loops:= @loops - 1; END WHILE 將兩個語句發送到服務器時,服務器將返回 2 個錯誤,但只顯示最后一個錯誤。

相反,您應該使用不同的分隔符:

 DELIMITER $$
 WHILE @loops > 0 DO 
   INSERT person(last_name, first_name, iso_country) 
   VALUES(census.random_name(0), census.random_name(FLOOR(1 + RAND() * (2 - 1 +1))), 'US');
   SET @loops := @loops - 1;
 END WHILE;$$

另見定界符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM