Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/75: Рейтинг темы: голосов - 75, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 25

Триггер на обновление поля в таблице

16.10.2017, 23:20. Показов 13890. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте столкнулся с такой проблемой у меня в таблице Сотрудник есть ИНН, но у некоторых сотрудников может не быть ИНН по этому не могу поставить ограничение на уникальность.
Создал два триггера на добавление и на обновление поля ИНН.
С триггером на добавление вообще проблем не было, а вот на обновление не могу понять как его написать.
Допустим есть два сотрудника у которых есть ИНН, и вот одному из них по религиозным причинам нужно убрать ИНН, но мой триггер то может сделать NULL, то выдает не понятную ошибку,а нужно сделать когда идет обновление то
1)проверять нет ли у кого-то из других сотрудников таких же ИНН если значение ИНН пришло не NULL,
2)если пришло значение ИНН NULL то изменить на NULL
3)и если обновляется там в таблице например Имя, а ИНН тот же то не менять его

Вот триггер на добавления
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE FUNCTION maindb.InsertIdentificationCode() RETURNS TRIGGER AS $$
DECLARE 
tempIdentification CHAR(10);
BEGIN
    
SELECT IdentificationCode INTO tempIdentification
FROM maindb.Employees
WHERE IdentificationCode = NEW.IdentificationCode;
 
IF (tempIdentification IS NOT NULL) THEN
RAISE EXCEPTION 'Сотрудник с таким ИНН уже существует';
RETURN OLD;
ELSE
RETURN NEW; 
END IF;
END;
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER InsertIdentification
BEFORE INSERT ON maindb.Employees FOR EACH ROW 
EXECUTE PROCEDURE maindb.InsertIdentificationCode();
а вот триггер на обновление
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION maindb.UpdateIdentificationCode() RETURNS TRIGGER AS $$
DECLARE 
tempIdentification CHAR(10);
BEGIN
 
SELECT IdentificationCode INTO tempIdentification
FROM maindb.Employees
WHERE IdentificationCode = NEW.IdentificationCode AND ID = NEW.ID;
 
 
IF (tempIdentification IS NULL) THEN
RETURN NEW;
ELSE
RAISE EXCEPTION 'Ошибка';
RETURN OLD;
END IF;
END;
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER UpdateIdentification
BEFORE UPDATE ON maindb.Employees FOR EACH ROW 
EXECUTE PROCEDURE maindb.UpdateIdentificationCode();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2017, 23:20
Ответы с готовыми решениями:

Обновление одного поля таблицы, при заполнении поля в другой таблице
Друзья помогите новичку! Есть две таблицы -продажа(id продажи, сумма продажи) -скидка(id скидки, id продажи, скидка 15%) Как...

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

Триггер на заполнение поля в дочерней таблице из другой таблицы при вводе данных в дочернюю
Необходимо заполнить поле date_admission в таблице deliveries(дочерняя), взяв значение date_end из таблицы contractual_deliveries(родитель)...

2
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
17.10.2017, 14:27
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
IF (NEW."ИНН" IS NOT NULL) THEN -- если пришло значение не NULL
  SELECT IdentificationCode INTO tempIdentification 
  FROM maindb.Employees
  WHERE IdentificationCode = NEW."ИНН"; -- проверяем в таблице это новое значение 
  IF (tempIdentification IS NOT NULL) THEN -- если нашли, значит ...
    RAISE EXCEPTION 'Такой ИНН уже существует';
  END IF;
END IF;
RETURN NEW; -- если нет, возвращаем то, что пришло с UPDATE'ом
я может неправильно логику уловил. Для быстрого поиска на поле "ИНН" сделать индекс.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 25
17.10.2017, 14:31  [ТС]
Я уже решил эту задачу, используя уникальный индекс на Поле ИНН, после этого это поле может быть NULL, и уникальным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2017, 14:31
Помогаю со студенческими работами здесь

Написать триггер для автоматического обновления поля при обновлении, удалении, добавлении записей в таблице
Добавить в таблицу «Продавцы» поле «Суммарный вес продаж» и написать триггер для автоматического обновления этого поля при обновлении,...

PHP обновление поля в таблице
Собственно вот чем проблема! Я с горем пополам сделал на ajax загрузку картинок, теперь мне надо что бы при загрузки картинки, имя...

Обновление поля одной таблице полем другой
Хочу обновить поле ValueBefore таблицы А значением поля Value из таблицы Б, т.е. А имеет поле ValueBefore, Б поле Value. В таблице А и Б...

Обновление поля в таблице с критерием новых записей в подформе
Доброго времени суток! Необходимо решить задачу с обновлением одного поля. Есть форма на которой расположены два поля со...

VBA: Запрос на обновление записи в таблице, по значению поля формы
Здравствуйте, есть вопрос. База данных "Гостиница". Как обновить данные в таблице "Номера", а конкретно поле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru