Mariadb -执行文件与将相同代码粘贴到控制台之间的差异

u4dcyp6a  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在尝试从SQL Server迁移到Mariadb,但我遇到了很多小问题,有时候会让我抓狂。其中最主要的是从文件执行脚本和将其粘贴到控制台窗口之间的明显区别。我习惯于在MSSQL中使用制表符来格式化代码,所以我仍然在尝试习惯Mariadb控制台中的制表符行为。但至少这是有意义的。var和@var之间的区别对我来说也很奇怪。下面的代码在通过Pycharm执行时运行良好,但在粘贴到控制台窗口时失败。我正在运行Mariadb(@@version:10.5.18-MariaDB-0 + deb11u1)在Pi Raspberry上通过SSH从Windows 11盒子访问它。
脚本所做的一切就是用美国人口普查数据中的姓和男/女名的随机组合填充一个表,以便进行测试。对于错误的任何帮助都将非常感激。我真的很想了解为什么粘贴和执行文件之间有区别。
循环设置:= 10;
当@循环〉0时,插入人员(姓,名,国际组织国家)值(人口普查.随机名(0),人口普查.随机名(楼层(1 + RAND()*(2 - 1 +1))),'美国');设置@循环:=@循环-1;结束时;
选择 * 来自人员;
错误1064(42000):SQL语法中有错误;查看与您的MariaDB服务器版本对应的手册,了解在第1行"END WHILE"附近使用的正确语法
我从PycharmIDE中执行了该文件,在那里它运行良好,并将相同的代码粘贴到Mariadb控制台中,在那里引发了错误,插入没有发生。

mwngjboj

mwngjboj1#

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;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;$$

另请参见Delimiters

相关问题