powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / копирование с одной таблицы на несколько других без повторения
16 сообщений из 16, страница 1 из 1
копирование с одной таблицы на несколько других без повторения
    #39159403
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Postgresql

имеются три таблицы Таб1, Таб2, Таб3

из Таб1 взять поля username и user_password в Таб2 username и passwaord,

в Таб3 нужно взять user_id из Таб2
и все user_id дать значение group_id=2
( В таб3 только два поля group_id и user_id)


все эти действия должны Обновляться с периодичностью и без повторения.

как сделать функцией и как будет вызываться автоматом?
буду признателен если хотя бы объясните
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39159420
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83Обновляться с периодичностью и без повторения.
- периодичность, значит не при событии вставки....обновления?
- без повторения что значит? Если по будильнику то будут повторения каждые 5 минут по будильнику.
- как сделать функцией - найди пример функции и начинай писать.
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39159847
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Периодичность,

в Таб1 будут попадать некоторые данные,
и тогда часть этих данных должны попасть в таб2,
дополнительно в таб3 рисоваться еще.

нужно следить чтобы в таблицах не было повторений данных чтобы не было два юзера с одинаковыми данными.

я понятия не имею это функция будет или что? как должно вызываться,

http://postgresql.ru.net/node/215199
вот тут примерно почитал, но я не понимаю как должно быть,

через insert я могу все сделать
Код: plsql
1.
insert into table1(f1, f2, f3) select 1, f2, f3 from table1 where f1>0



но нужно чтобы данные обновлялись каждый раз кгда происходит обращение к таблице таб1
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39159952
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня получается вручную так копировать данные из одной таблицы в другую,
я думал может есть функция, которая будет сама делать все, и обновлять данные

Код: plsql
1.
2.
INSERT INTO tab3 (group_id, user_id) select 2, user_id from tab2;
INSERT INTO tab2 (username, user_password, user_active) select username, password, 1  tab1;
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160212
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83но нужно чтобы данные обновлялись каждый раз кгда происходит обращение к таблице таб1
это ключевое слово.
Значит на событие вставка в таб1 будет запускаться твоя функ1.
- делай триггер на таб1 с запуском функ1.
Потом всё остальное.
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160213
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160690
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Вот я примерное накидал как должно быть

Поставил только на два события апдейт и инсертят когда в таблицу
Код: plsql
1.
2.
3.
4.
-- триггер вещаем на таблицу

CREATE TRIGGER t_user
AFTER INSERT OR UPDATE  ON users FOR EACH ROW EXECUTE PROCEDURE add_to_users();




а здесь сама функция, на два события
но что то не то делает
Код: plsql
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.
-- составляем фукнцию

CREATE OR REPLACE FUNCTION add_to_users() RETURNS TRIGGER AS $$
DECLARE
      user_active varchar(255);
      username varchar(255);
      password varchar(255);
      username varchar(255);
      user_password varchar(255);
      user_id int(100);
      group_id int(100);

BEGIN
    IF    TG_OP = 'INSERT' THEN
        INSERT INTO jforum_users (username, user_password, user_active) 
      select username, password, 1  from users;
    And 
      INSERT INTO jforum_user_groups (group_id, user_id) 
      select 2, user_id from jforum_users;
        RETURN NEW;
    ELSIF TG_OP = 'UPDATE' THEN
        INSERT INTO jforum_users (username, user_password, user_active) 
      select username, password, 1  from users;
    And 
      INSERT INTO jforum_user_groups (group_id, user_id) 
      select 2, user_id from jforum_users;
        RETURN NEW;
        END IF;
END;
$$ LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160731
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83,

зачем у вас AND между инсертами?
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160735
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83,

и почему вы задекларировали переменные, которые далее используете? имелось ввиду NEW.field1, NEW.field2 ?
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39160744
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION add_to_users() RETURNS TRIGGER AS $$
BEGIN
    -- поскольку эта ф-я будет использоватся при инсерт и апдейт, 
    -- и насколько я вижу в обоих случаях код одинаков, 
    -- то иф-енд иф часть можно убрать...
    IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') 
    THEN         
        INSERT INTO jforum_users (username, user_password, user_active) 
        VALUES(NEW.username, NEW.password, 1);
        INSERT INTO jforum_user_groups (group_id, user_id) 
        SELECT 2, currval(user_id_jforum_users.seq); -- как называется у вас сиквенс я не знаю
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161720
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN

    IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') 
    THEN         
        INSERT INTO jforum_users (username, user_password, user_active) 
        VALUES(NEW.username, NEW.password, 1);
        INSERT INTO jforum_user_groups (group_id, user_id) 
        SELECT distinct 1, currval('jforum_users_seq'); 
    END IF;
    RETURN NEW;
END;



а как написать здесь же, если в первой таблице я изменяю данные, то они и тут в jforum_users и jforum_user_groups изменялись, а то сейчас происходит так

в таб1 изменяю а в jforum_users и jforum_user_groups добавляются новые значения
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161729
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83,
информатику в школе проходил?
- раздели на 2 ветки = вставка\обновление
Lonepsycho
Код: sql
1.
2.
3.
4.
    -- поскольку эта ф-я будет использоватся при инсерт и апдейт, 
    -- и насколько я вижу в обоих случаях код одинаков, 
    -- то иф-енд иф часть можно убрать...
    IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') 
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161849
alamak83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

пробовал разделить, он не заменяет то что было, и а просто добавляет ту же строку только с другими значениями
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161916
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83Petro123,

пробовал разделить, он не заменяет то что было, и а просто добавляет ту же строку только с другими значениями
кажется тут уместен Сибиряков, с пожеланиями Merge и/или их ПЖ инкарнаций.
18752366
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161927
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83Petro123,

пробовал разделить, он не заменяет то что было, и а просто добавляет ту же строку только с другими значениями
давай конкретнее.
- пример строк в той что было и пример строк что надо.
As Is to Be
...
Рейтинг: 0 / 0
копирование с одной таблицы на несколько других без повторения
    #39161946
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alamak83,

тупой пример...
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
-- init

CREATE TABLE public.a (id SERIAL, val TEXT,
  CONSTRAINT idx_a_pkey PRIMARY KEY(id));
CREATE TABLE public.b (id INTEGER, val TEXT);
CREATE TABLE public.c (id INTEGER, val TEXT);

CREATE FUNCTION public.ftr_a_a_iu_r (
)
RETURNS trigger AS
$body$
BEGIN
  IF (TG_OP = 'INSERT')
  THEN
    INSERT INTO public.b(id, val) VALUES (NEW.id, NEW.val);
    INSERT INTO public.c(id, val) VALUES (NEW.id, NEW.val);
  ELSIF (TG_OP = 'UPDATE')
  THEN
    UPDATE public.b SET val = NEW.val WHERE b.id = OLD.id;
    UPDATE public.c SET val = NEW.val WHERE c.id = OLD.id;
  ELSE
    RAISE EXCEPTION 'UNEXPECTED trigger operation';
  END IF;
  RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

CREATE TRIGGER tr_a_a_iu_r
  AFTER INSERT OR UPDATE 
  ON public.a FOR EACH ROW 
  EXECUTE PROCEDURE public.ftr_a_a_iu_r();

INSERT INTO public.a (val)
VALUES ('a'), ('b');

UPDATE public.a SET val = 'd' WHERE a.id = 1;

-- check

SELECT * FROM public.a;
SELECT * FROM public.b;
SELECT * FROM public.c;

-- cleanup

DROP TABLE public.a;
DROP TABLE public.b;
DROP TABLE public.c;

DROP FUNCTION public.ftr_a_a_iu_r ();
-- life's good
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / копирование с одной таблицы на несколько других без повторения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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