在检查行是不是已存在时,选择不会从表中获取任何内容
Posted
技术标签:
【中文标题】在检查行是不是已存在时,选择不会从表中获取任何内容【英文标题】:Select gets nothing from the table when checking if a row already exists在检查行是否已存在时,选择不会从表中获取任何内容 【发布时间】:2020-11-19 04:06:50 【问题描述】:我正在尝试在我的表中创建一行,但我也在验证是否有需要在另一个表中引用的记录。那是在一个存储过程中,并且一直在为其他表工作,直到我得到这个更复杂并且有更多参数的表。我创建了一个用于测试的存储过程,似乎我的参数有问题,因为当参数数量增加时,即使我正在查看的表中有记录,我的所有选择都返回 0。
这是我的代码
CREATE DEFINER=`root`@`localhost` PROCEDURE `CriarPF`(
nome TEXT,
cpf varchar(11),
sexo text,
escolaridade text,
data_nasc DATE,
fornecedor BIT(1),
estado_civil text,
email TEXT,
identidade text,
cidade TEXT,
estado TEXT)
BEGIN
if (select not exists (select * from sexo where nome = sexo)) then
call CriarSexo(sexo);
end if;
if ((select exists (select * from escolaridade where nome = escolaridade))=0) then call CriarEscolaridade(escolaridade);
end if;
if ((select exists (select * from estado_civil where nome = estado_civil))=0) then call CriarEstadoCivil(estado_civil);
end if;
if ((select exists (select * from cidade where nome = cidade))=0) then call CriarCidade(cidade, estado);
end if;
call CriarPessoa(pessoa);
insert into pessoa_fisica (Pessoa_idPessoa, cpf, Sexo_idSexo, Escolaridade_idEscolaridade, data_nasc, fornecedor, Estado_civil_idEstado_civil, email, identidade, Cidade_idCidade)
values (last_insert_id(), '01433333333', (select idSexo from sexo where nome = sexo), (select idEscolaridade from escolaridade where nome = escolaridade), '2012-12-12', 0, (select idEstado_civil from estado_civil where nome = estado_civil), 'bug@bug.com', '1234567', (select idCidade from cidade where nome = cidade));
END
【问题讨论】:
如果您有示例数据要包含在问题中,您可以将其包含在问题中,因为这将有助于查看和调试。 【参考方案1】:当变量和列具有相同的名称时,变量具有优先级。如果您需要访问列值,您必须指定一个表。 IE。在
if (select not exists (select * from sexo where nome = sexo)) then
nome
和 sexo
都是过程参数的输入变量,而在
if (select not exists (select * from sexo where sexo.nome = sexo)) then
sexo.nome
是表列,sexo
是变量。
考虑到这一点并更正所有代码。
PS。在显示的代码语句中,外部 SELECT 是多余的,if not exists (select * from sexo where nome = sexo) then
就足够了。
【讨论】:
我也尝试将变量的名称更改为 Sexo 或 nomeSexo,但问题仍然存在。也许我应该始终将该列指定为sexo.variable
。非常感谢!!!【参考方案2】:
Akina 是正确的,mysql 允许变量名看起来像列名——这会影响查询。要解决此问题,请为您的参数命名,使其不太可能干扰列名。
我使用这样的约定:
CREATE DEFINER=`root`@`localhost` PROCEDURE `CriarPF`(
nome TEXT,
in_cpf varchar(11),
in_sexo text,
in_escolaridade text,
in_data_nasc DATE,
in_fornecedor BIT(1),
in_estado_civil text,
in_email TEXT,
in_identidade text,
in_cidade TEXT,
in_estado TEXT
)
in_
表示这是一个只读参数(“输入”)。
【讨论】:
以上是关于在检查行是不是已存在时,选择不会从表中获取任何内容的主要内容,如果未能解决你的问题,请参考以下文章