MySQL:如何从命令行传递参数?

时间:2016-08-02 15:59:06

标签: mysql sql

在PostgreSQL中,您可以在使用psql运行查询时从命令行传入命名参数。例如,如果您运行如下命令:

psql -v v1=12 -f query.sql

在query.sql中你可以像这样引用v1:

select * from table_1 where id = :v1;

MySQL是否支持类似的东西?

2 个答案:

答案 0 :(得分:1)

是的。
TLDR;使用您问题中的示例:

SET @v1=12;
SELECT * FROM table_1 WHERE id = @v1;

请注意,它们在当前会话结束时被销毁。

详细信息

MySQL中的用户定义变量以@开头。

这里是设置变量的一种方法:

SET @mysite := "example.com";

设置变量时,您还可以使用MySQL的CONCAT:

SET @home_url := CONCAT("https://www.", @mysite);
SET @site_url := CONCAT(@home_url, "/wordpress");

查看其值:
    SELECT @mysite, @home_url, @site_url;

+-------------+-------------------------+-----------------------------------+
| @mysite     | @home_url               | @site_url                         |
+-------------+-------------------------+-----------------------------------+
| example.com | https://www.example.com | https://www.example.com/wordpress |
+-------------+-------------------------+-----------------------------------+
1 row in set (0.00 sec) 

要更新一些值:

UPDATE wp_options SET option_value = @home_url WHERE option_name = "home";
UPDATE wp_options SET option_value = @site_url WHERE option_name = "siteurl";

不幸的是,似乎没有办法让MySQL向您显示所有用户定义变量的列表。 例如,SHOWVARIABLES LIKE "%my%"仅显示(系统变量),而没有用户定义的变量。

但是,如果您运行的是MariaDB 10.2(相当于MySQL 5.7)或更高版本,MariaDB提供了一个可创建用户变量表的插件,因此您可以查询该表。
有关详细信息,请参见my answer here

答案 1 :(得分:0)

存储过程示例。

DROP PROCEDURE IF EXISTS so_gibberish.blahBlah7;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE so_gibberish.blahBlah7
(
)
BEGIN
    select CONCAT('The variable is ',@myVar) AS 'theAnswer';
END$$
DELIMITER ;

测试它:

OS Prompt> mysql -uroot -p so_gibberish -e "set @myVar='Hank Aaron'; call blahBlah7();"
Enter password: ********
+----------------------------+
| theAnswer                  |
+----------------------------+
| The variable is Hank Aaron |
+----------------------------+

so_gibberish是数据库名称。 -e表示运行此查询。

@myVar成为基于连接的用户变量。