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