在检查行是不是已存在时,选择不会从表中获取任何内容

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

nomesexo 都是过程参数的输入变量,而在

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_ 表示这是一个只读参数(“输入”)。

【讨论】:

以上是关于在检查行是不是已存在时,选择不会从表中获取任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Room:如何检查行是不是存在

MySQL:PHP:由于警告,无法从表中获取数据

我想从表中获取行 ID

SQL:如何从表A中一一检查是不是存在于表B上?

从表中选择前 N 行

SQL 语法从表中选择某些内容,如果结果不存在,则将结果插入新表中