powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / В Trigger сделать Select и в зависимости от результата Insert или Update
17 сообщений из 17, страница 1 из 1
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995429
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно в Триггере сделать выборку (обычный Select) и в зависимости от результата выполнить операцию Вставки записи в другую таблицу (Insert) или обновить существующую запись (Update).
Возможно ли такое сделать в СкуЛайте?
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995439
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно, с помощью WHEN-секций в триггере. Раз , два .
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995457
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть надо будет создавать 2-а триггера?
1. WHEN EXISTS
2. WHEN NOT EXISTS
?
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995468
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А insert or update уже отменили?
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995480
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
insert or update вставляет/обновляет в зависимости от ситуации в обновляемой таблице, а ТСу нужно выполнить операцию Вставки записи в другую таблицу
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995492
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatinsert or update вставляет/обновляет в зависимости от ситуации в обновляемой таблице, а ТСу нужно выполнить операцию Вставки записи в другую таблицуЧитать надо до конца: "выполнить операцию Вставки записи в другую таблицу (Insert) или обновить существующую запись (Update)."
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995506
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, а условие высчитывается по первой таблице. Т.е. не "добавить, а если там нет - обновить", а "в зависимости от выборки из левой первой таблицы - или вставить, или обновить во второй". Хотя, конечно, выглядит подозрительно, я бы ещё послушал как пришли к этим двум таблицам при проектировании БД, что в них хранится. Может, база спроектирована криво.
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995724
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оперативные остатки.
Есть таблица Движение товара . При изменении этой таблицы надо вставить запись в таблицу Оперативные остатки .
Если в таблице Оперативные остатки уже есть запись (ТоварID, СкладID, К-во), то обновить её (изменив к-во +/-). Иначе внести новую запись, т.к. может добавили новый Склад/Товар и таб О.С. ещё не содержит по ним инфу.
Структуры таблиц давать не буду, они стандартные.
Вот таки дела.

Создал несколько триггеров:
WHEN NOT EXISTS (в таб о.с. записи) - тогда INSERT (ТоварID, СкладID, К-во)
WHEN EXISTS (в таб о.с. записи) - тогда, только, UPDATE (+/- К-во)
...
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38995998
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пф-ф, это в чистом виде insert or update: При изменении этой таблицы (Движение товара) надо вставить запись в таблицу Оперативные остатки. Если в таблице Оперативные остатки уже есть запись (ТоварID, СкладID, К-во), то обновить её (изменив к-во +/-). Иначе внести новую записьТ.е. Вы проверяете наличие записи в той же таблице, в которую вставляете, а не в другую таблицу, как указано в первом посте.

Второй триггер выкинуть, WHEN в оставшемся выкинуть, тело триггера заменить на insert or update.
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996212
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер на события таблицы "Движение товара": добавление (INSERT) или удаление (DELETE) записи
Изменения/Вставка записи в таблицу "Оперативные остатки".
Не понимаю, как обойтись без "WHEN" ... ?
Надо же проверить, если ли запись в таблице "Оперативные остатки", а для этого используется "WHEN".
А можете подсказать, как заменить "WHEN" на "insert or update"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TRIGGER TG_INSERT_PartyStock_Remnants AFTER INSERT ON [PartyStock] 
WHEN NOT EXISTS ( 
              SELECT DirNomenID, DirWarehouseID
              FROM Remnants
              WHERE
               DirNomenID = (SELECT DirNomenID FROM Party, PartyStock WHERE Party.PartyID=PartyStock.PartyID and PartyStock.PartyStockID = NEW.PartyStockID) 
               and
               DirWarehouseID = (SELECT DirWarehouseID FROM PartyStock WHERE PartyStockID = NEW.PartyStockID) 
              ) 

BEGIN
    INSERT INTO Remnants (DirNomenID, DirWarehouseID, [Count])
    SELECT DirNomenID, DirWarehouseID, [Count] FROM Party, PartyStock WHERE Party.PartyID=PartyStock.PartyID and PartyStock.PartyStockID = NEW.PartyStockID;
END;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TRIGGER TG_UPDATE_PartyStock_Remnants AFTER INSERT ON [PartyStock]
WHEN EXISTS (
              SELECT DirNomenID, DirWarehouseID
              FROM Remnants
              WHERE
               DirNomenID = (SELECT DirNomenID FROM Party, PartyStock WHERE Party.PartyID=PartyStock.PartyID and PartyStock.PartyStockID = NEW.PartyStockID)
               and
               DirWarehouseID = (SELECT DirWarehouseID FROM PartyStock WHERE PartyStockID = NEW.PartyStockID)
              )
BEGIN
    UPDATE Remnants
    SET [Count] = [Count] + (SELECT PartyStock.[Count] FROM PartyStock WHERE PartyStockID = NEW.PartyStockID)
    WHERE
     DirNomenID = (SELECT DirNomenID FROM Party, PartyStock WHERE Party.PartyID=PartyStock.PartyID and PartyStock.PartyStockID = NEW.PartyStockID)
     and
     DirWarehouseID = (SELECT DirWarehouseID FROM PartyStock WHERE PartyStockID = NEW.PartyStockID);
END;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER TG_DELETE_PartyStock_Remnants BEFORE DELETE ON [PartyStock]
BEGIN
    UPDATE Remnants
    SET [Count] = [Count] - (SELECT PartyStock.[Count] FROM PartyStock WHERE PartyStockID = OLD.PartyStockID)
    WHERE
     DirNomenID = (SELECT DirNomenID FROM Party, PartyStock WHERE Party.PartyID=PartyStock.PartyID and PartyStock.PartyStockID = OLD.PartyStockID)
     and
     DirWarehouseID = (SELECT DirWarehouseID FROM PartyStock WHERE PartyStockID = OLD.PartyStockID);
END;



где
DirNomenID - ID-шник Товара (Номенклатура товара)
Party, PartyStock - партии на складе, в данному случае выполняют роль таблиц движения.
Триггер на события таблицы "PartyStock".
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996251
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо же проверить, если ли запись в таблице "Оперативные остатки"
именно так и работает insert or update. Это гибрид вставки и обновления. Если в таблице уже есть запись с тем же набором данных, то произойдёт её обновление, если ещё нет - в таблице появится новая запись.

В SQLite эта инструкция называется немножко по-другому, видимо потому, что можно выбрать реакцию на конфликт :

insert or replace into table(col1, ...)
values (val1, ...);

replace сработает в случае конфликта первичного ключа или ограничения уникальности, insert сработает в отсутствие конфликтов.
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996310
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatinsert or update
А где можно глянуть пример использования insert or update ?
Потому, что тут не могу найти, гугл тоже не даёт результатов ...
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996319
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и мне надо при UPDATE увеличить количество:
Код: sql
1.
2.
3.
...
SET [Count] = [Count] + (SELECT PartyStock.[Count] FROM PartyStock WHERE PartyStockID = NEW.PartyStockID)
...
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996338
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Методичка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
-- тестовая таблица с PRIMARY KEY или UNIQUE
CREATE TABLE TBL(
  ID INTEGER NOT NULL PRIMARY KEY,
  DATA INTEGER);

-- тестовый запрос
INSERT OR REPLACE INTO TBL( 
  ID, -- по идентификатору есть первичный ключ, 
  DATA)
VALUES (
  100, -- здесь тоже может быть подзапрос, как ниже
  (SELECT COALESCE(DATA, 0) 
   FROM TBL 
   WHERE ID = 100) + 1);

-- ==============================================
-- после первого вызова запроса в таблице одна новая запись:
(100, 1)
-- после второго вызова того же запроса остаётся эта же запись:
(100, 2)

-- ===============================================
-- хорошо, теперь убираем первичный ключ из таблицы:
DROP TABLE TBL;
CREATE TABLE TBL(
  ID INTEGER ,
  DATA INTEGER);

--================================================
-- после первого вызова запроса в таблице одна новая запись:
(100, 1)
-- после второго вызова в таблице две записи:
(100, 1),
(100, 2) -- replace не сработал - не было конфликта PRIMARY KEY или UNIQUE


Д/з: а как себя поведёт такой же запрос с rowid к таблице без PRIMARY KEY или UNIQUE?
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996339
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И энто, забрамшись после вечернего купания под одеяло, да потягивая перед сном горячее молоко с мёдом, извольте ознакомиться с тутошними синтаксическими диаграммами. Они - ей-богу! - не кусаются.
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996346
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу, а я ищу "insert or update" ...
...
Рейтинг: 0 / 0
В Trigger сделать Select и в зависимости от результата Insert или Update
    #38996351
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Upd: coalesce, разумеется, надо за select..where вытаскивать, иначе он на нулевой выборке не сработает и милиционер получится вернётся null. т.е. получится coalesce((select..), default).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / В Trigger сделать Select и в зависимости от результата Insert или Update
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]