Как исправить ошибку 1054 после создания триггера после обновления - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема с обновлением данных после создания триггера. Триггер объединяет 2 таблицы (люди и церкви) и должен обновлять churchID при обновлении названия церкви в таблице церквей.

Я пытался поместить подзапрос в оператор set, но я получил другую ошибку 1093 , в которой говорится, что вы не можете указать целевую таблицу 'people' в предложении FROM.

Вот мой триггер

delimiter $$
CREATE TRIGGER churchID_update_change AFTER UPDATE ON people
FOR EACH ROW
BEGIN
IF NEW.church != OLD.church THEN
    UPDATE people as p, (SELECT DISTINCT c.churchID
FROM churches c LEFT OUTER JOIN people p
    ON c.name = p.church
    WHERE NEW.church = c.name) as new_church
    SET p.churchID = new_church
    WHERE NEW.church = NEW.church;
    END IF;
END
$$
delimiter ;

Вот обновление, которое я пытаюсь сделать:

UPDATE people
SET church = 'Efree'
WHERE firstname = 'Mark';

Таблица сотрудников имеет следующие поля:

  • PersonID int NOT NULL PK
  • имя varchar NOT NULL
  • фамилия варчар NOT NULL
  • телефон varchar
  • Элемент списка
  • церковный варчар НЕ НУЛЬ
  • churchID int NOT NULL fk (ссылки на churchID в таблице церквей)
  • адрес varchar
  • email varchar
  • ноты Варчар

база данных церквей

  • churchID INT NOT NULL pk
  • имя varchar NOT NULL рк
  • телефон VARCHAR
  • адрес VARCHAR
  • ноты VARCHAR

То, что я пытаюсь сделать с этим триггером, это то, что когда личная церковь изменяется, она автоматически меняет churchID на churchID, который выстраивается в таблице церквей

Например, если вы делаете

SELECT churchID
FROM churches
WHERE name = 'federated';

он вернул бы churchID, равный 1, или если бы вы сделали

`SELECT churchID`
FROM churches
WHERE name = 'EFree'

это вернул бы churchID 6

Так что после обновления, которое я сейчас делаю, должно возвращаться «имя» Марка и «churchID», равное 6.

Точная ошибка Error Code: 1054. Unknown column 'new_church' in 'field list'

1 Ответ

0 голосов
/ 21 мая 2019

Я наконец понял это после большого количества поисков в Google. Я обнаружил, что мне не нужно предложение UPDATE, и чтобы использовать свой подзапрос в предложении SET, мне нужно было вложить подзапрос в другой. Вот мой фиксированный код:

delimiter $$
CREATE TRIGGER churchID_people_updateTrig BEFORE UPDATE on people
FOR EACH ROW
BEGIN 
IF NEW.church != OLD.church THEN
SET new.churchID =  (SELECT * FROM (SELECT DISTINCT c.churchID 
FROM churches c LEFT OUTER JOIN people p 
    ON c.name = p.church
WHERE p.church = NEW.church) as x);
END IF;
END
$$
delimiter ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...