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

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

16.10.2017, 23:20. Показов 13846. Ответов 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
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru