Как написать триггер MySQL, который допускает нулевые значения при проверке ссылочной целостности? - PullRequest
0 голосов
/ 16 июня 2011

Я работаю в phpMyAdmin 3.3.9 с mySQL 5.5.8.У меня есть база данных с таблицами myISAM, поэтому мне пришлось написать триггер для проверки ссылочной целостности между двумя полями таблицы.У меня есть таблица project_key с первичным ключом, указанным в поле process ID.Вторая таблица - hvi, и она также содержит поле process ID.process ID s в таблице hvi также должны быть в таблице project_key.Поэтому я написал триггер для отображения ошибки, если это не так, который выглядит следующим образом:

create trigger t1
before insert   
on hvi
for each row
begin
declare dummy int;
. . .
if new.`process id` not in(select `process id` from `project_key`) then 
select `Process ID not in project_key`
into dummy
from hvi
where `KEY`= new.`KEY`;
end if;
end;

Если идентификатор процесса не равен нулю, это работает просто отлично.Когда он ловит process ID, который пытается импортировать в hvi, которого еще нет в таблице project_key, отображается сообщение об ошибке «Неизвестный столбец« Идентификатор процесса отсутствует в ключе проекта »в« списке полей »», как будто этозакодирован для выполнения.

Проблема возникает, когда у меня нет process ID для строки данных (что является обычным явлением).В моей записи данных будет пустое пространство, поэтому я хочу, чтобы триггер преобразовал это пустое пространство в нулевое значение и затем принял это нулевое значение.Я пытался закодировать это так, но это не сработало:

create trigger nullt1
before insert   
on hvi
for each row
begin
declare dummy int;
if new.`Process ID` = ' ' then
set new.`Process ID` = null;
end if;
. . .
if new.`process id` not in(select `process id` from `project_key`) or null then 
select `Process ID not in project_key`
into dummy
from hvi
where `KEY`= new.`KEY`;
end if;
end;

Я делал снимок в темноте с разрешением нулевой части, потому что я никогда раньше не пробовал ничего подобного (Я сделал преобразование пустых пространств в нулевые значения раньше, и это работает).Этот триггер в целом, очевидно, не работал, хотя, когда я пытался импортировать строку с пустым пространством, он все равно выдает мне ошибку «Неизвестный столбец« Идентификатор процесса отсутствует в ключе проекта »в« списке полей »».

Кто-нибудь знает, как я могу сделать эту работу?

1 Ответ

0 голосов
/ 16 июня 2011

Переместите чек if '' внутрь удостоверения личности.

if new.`process id` not in(select `process id` from `project_key`) then 
  if new.`process id` = ' ' then
    set new.`Process ID` = null;
  else
    select `Process ID not in project_key`
    into dummy
    from hvi
    where `KEY`= new.`KEY`;
  end if;
end if;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...