MySQL变量名与字段名冲突

时间:2018-02-08 18:39:25

标签: mysql stored-procedures

我正在为MySQL编写一个存储过程,它需要一个与表中字段同名的输入参数。我知道我可以将该字段称为tableName.fieldName。但是,当在程序中查询该表时,如何以非模糊的方式引用变量

Table files
+----+---------+---------+
| id | ownerId | content |
+----+---------+---------+

CREATE PROCEDURE getFilesOfOwner(IN ownerId INT)
BEGIN
  SELECT * FROM files WHERE files.ownerId = ___________      <- ?
  ...

1 个答案:

答案 0 :(得分:1)

如果过程参数的名称与表的字段名称相同,则在对该表的查询中使用该标识符将被MySQL解释为对变量的引用,即不正式需要限定符,但是这只是特定于供应商的冲突解决方案。

保持参数名称相同的解决方案是在过程范围内声明范围内,但是在所需名称下将其公开给调用者:

CREATE PROCEDURE getFilesOfOwner(IN ownerId INT)
BEGIN
  DECLARE _ownerId INT DEFAULT ownerId;
  SELECT * FROM files WHERE files.ownerId = _ownerId
  ...

这需要一行额外的代码,但它使程序签名保持清洁,不受特定于实现的细节的影响。