powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, INSERT, TRIGGER
4 сообщений из 4, страница 1 из 1
SQLite, INSERT, TRIGGER
    #35851528
Фотография BION
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уно ди лос проблемас.

Емеем две таблицы:
Test1IDNAME.... Test2IDTEST1_ID....

Задача следующая: при добавлении новой записи в таблицу TEST2 необходимо проверить, существует ли в таблице TEST1 запись с добавляемым полем NAME, т.е. INSERT выглядит так:
Код: plaintext
INSERT INTO TEST2(TEST1_ID) VALUE('Паша')
Если запись с именем "Паша" уже существует, то выдираем ее ID и каким-то образом в указанном выше запросе заменяем стринговое значение на INTEGER(т.к. TEST1_ID - INTEGER). Соответственно такую же замену необходимо произвести, если запись с именем "Паша" отсутствует в табл. TEST1 (добавляем и получаем его ID).

Проверку и добавление я реализовал. Но остальное.
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TRIGGER TEST_tmp
	BEFORE INSERT OF agent_card ON operations FOR EACH ROW WHEN NOT EXISTS(
                SELECT name FROM test1 WHERE name = new.test1_ID
        )
BEGIN 
	INSERT INTO test1 (name) VALUES(new.test1_ID);
END;

В результате должно быть так:
Test1IDNAME1Паша Test2IDTEST1_ID11
...
Рейтинг: 0 / 0
SQLite, INSERT, TRIGGER
    #35851562
Фотография BION
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TRIGGER TEST_ifNotEx
	BEFORE INSERT ON test2 FOR EACH ROW WHEN NOT EXISTS(
                SELECT name FROM test1 WHERE name = new.test1_ID
        )
BEGIN 
	INSERT INTO test1 (name) VALUES(new.test1_ID);
END
...
Рейтинг: 0 / 0
SQLite, INSERT, TRIGGER
    #35851585
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема то?

Вообще, подобную задачу я решал бы так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create trigger if not exists AddRecordInTest2 instead of insert on test2 for each row
begin
  insert into Test1(Name) 
      select new.Test1_ID where not exists (select * from Test1 where Name=new.Test1_ID);

  insert into Test2(Test1_ID)
      select ID from Test1 where Name=new.Test1_ID;
end;
Но вообще-то, я очень не рекомендую делать подобный триггер. Он делает неожиданное с точки зрения формальной структуры таблицы.
Пока ты помнишь что этот триггер существует - все будет замечательно, но через год ты забудешь о его существовании и будешь удивляться почему прямая вставка реально существующего Test1.ID в Test2.Test1_ID создает новое имя...
...
Рейтинг: 0 / 0
SQLite, INSERT, TRIGGER
    #35851785
Фотография BION
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то INSTEAD OF вообще не работает, запрос сквозь него пролетает. Причем ведь он работает только с view. Создал view:
Код: plaintext
create view if not exists test2_view as select * from test2
но ему хоть об стенку горох.

Вообще, я тоже думал стоит ли делать все это, проще может быть в коде провернуть. Но, ведь никто не мешает перед операцией ввода, непосредственно в программе инициировать создание это триггера. Тогда все будет перед глазами.

Так или иначе, что-то тут не работает.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, INSERT, TRIGGER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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