Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / копирование с одной таблицы на несколько других без повторения / 16 сообщений из 16, страница 1 из 1
31.01.2016, 11:20
    #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
31.01.2016, 13:13
    #39159420
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
alamak83Обновляться с периодичностью и без повторения.
- периодичность, значит не при событии вставки....обновления?
- без повторения что значит? Если по будильнику то будут повторения каждые 5 минут по будильнику.
- как сделать функцией - найди пример функции и начинай писать.
...
Рейтинг: 0 / 0
01.02.2016, 10:33
    #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
01.02.2016, 12:04
    #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
01.02.2016, 14:22
    #39160212
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
alamak83но нужно чтобы данные обновлялись каждый раз кгда происходит обращение к таблице таб1
это ключевое слово.
Значит на событие вставка в таб1 будет запускаться твоя функ1.
- делай триггер на таб1 с запуском функ1.
Потом всё остальное.
...
Рейтинг: 0 / 0
01.02.2016, 14:23
    #39160213
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
...
Рейтинг: 0 / 0
02.02.2016, 08:43
    #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
02.02.2016, 09:41
    #39160731
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
alamak83,

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

и почему вы задекларировали переменные, которые далее используете? имелось ввиду NEW.field1, NEW.field2 ?
...
Рейтинг: 0 / 0
02.02.2016, 09:52
    #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
03.02.2016, 11:08
    #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
03.02.2016, 11:25
    #39161729
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
alamak83,
информатику в школе проходил?
- раздели на 2 ветки = вставка\обновление
Lonepsycho
Код: sql
1.
2.
3.
4.
    -- поскольку эта ф-я будет использоватся при инсерт и апдейт, 
    -- и насколько я вижу в обоих случаях код одинаков, 
    -- то иф-енд иф часть можно убрать...
    IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') 
...
Рейтинг: 0 / 0
03.02.2016, 12:34
    #39161849
alamak83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
копирование с одной таблицы на несколько других без повторения
Petro123,

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

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

пробовал разделить, он не заменяет то что было, и а просто добавляет ту же строку только с другими значениями
давай конкретнее.
- пример строк в той что было и пример строк что надо.
As Is to Be
...
Рейтинг: 0 / 0
03.02.2016, 13:41
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / копирование с одной таблицы на несколько других без повторения / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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