Select ничего не получает из таблицы при проверке, существует ли строка

#mysql #sql #mysql-workbench

#mysql #sql #mysql-workbench

Вопрос:

я пытаюсь создать строку в своей таблице, но я также проверяю, есть ли запись, на которую мне нужно ссылаться в другой таблице. Это находится внутри хранимой процедуры и работает для других таблиц, пока я не доберусь до этой, которая является более сложной и имеет больше параметров. Я создал хранимую процедуру для тестирования, и кажется, что с моими параметрами что-то не так, потому что при увеличении количества параметров все мои выборки возвращают 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. Если у вас есть образцы данных для включения в вопрос, вы можете включить их в вопрос, поскольку это будет полезно для проверки и отладки.

Ответ №1:

Когда переменная и столбец имеют одинаковое имя, тогда переменная имеет приоритет. Если вам нужно получить доступ к значению столбца, вы ДОЛЖНЫ указать таблицу. Т.е. в

 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 достаточно.

Комментарии:

1. Я также попытался изменить имя переменной на Sexo или nomeSexo, но проблема не исчезла. Возможно, мне всегда следует указывать столбец как sexo.{variable} . Большое вам спасибо!!!

Ответ №2:

Акина права, что 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_ указывает, что это параметр только для чтения («ввод»).