powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автозаполнение связанных полей Postgresql.
17 сообщений из 17, страница 1 из 1
Автозаполнение связанных полей Postgresql.
    #38524163
Здравствуйте уважаемые друзья. Имеются несколько связанных внешними ключами таблиц.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE data
(
  id bigserial NOT NULL,
  meta_data integer NOT NULL,
  s_ep_mkd integer,
  CONSTRAINT data_pkey PRIMARY KEY (id ),
  CONSTRAINT external_key1 FOREIGN KEY (meta_data)
      REFERENCES meta_data (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT external_key2 FOREIGN KEY (s_ep_mkd)
      REFERENCES s_ep_mkd (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)



и

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE meta_data
(
  year integer NOT NULL,
  month integer NOT NULL,
  inn character varying NOT NULL,
  kpp character varying,
  ogrn character varying,
  adr_code character varying NOT NULL,
  doc_type integer NOT NULL,
  vers_form character varying NOT NULL,
  id bigserial NOT NULL,
  CONSTRAINT meta_data_pkey PRIMARY KEY (id )
)





поле meta_data первой таблицы связано со значение id второй таблицы. Можео ли сделать так чтоб поле meta_data автоматически заполнялось при появлении записи в поле id.

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

вставить во вью [джойна] (триггер/руле)?
http://www.sql.ru/forum/actualsearch.aspx?search=view foreign key insert&sin=0&bid=7&a=&ma=0&dt=-1&s=1&so=1

вставить и туда и сюда хранимкой ?

что-то ещё ?

т.к. обычный инсерт в обычную таблу никаких проблем не вызывает. как и 2 последовательных - в разные. начала в мастер, потом - в слейв.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524314
Dim666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовМожео ли сделать так чтоб поле meta_data автоматически заполнялось при появлении записи в поле id.А каким значением? Если константой, то
Код: plsql
1.
ALTER TABLE data ALTER COLUMN meta_data SET DEFAULT <константа>;


Иначе делать хранимой процедурой.

p.s. Раз meta_data.id у вас типа bigserial, то вообще наверно логично, чтобы data.meta_data было bigint?
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524470
Тригернуя функция будет иметь следующий вид?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION data_table_insert()
  RETURNS trigger AS
$BODY$
   BEGIN 

         NEW.meta_data:=meta_data.id;
         NEW.s_ep_mkd:=s_ep_mkd.id;

       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION data_table_insert()
  OWNER TO postgres;



Отмечу что s_ep_mkd является таблицей на которую ссылается второй внешний ключ из таблицы data. Также хотелось бы отметить? Тригер надо делать типа AFTER?
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524477
Dim666Нариман АлимурадовМожео ли сделать так чтоб поле meta_data автоматически заполнялось при появлении записи в поле id.А каким значением? Если константой, то
Код: plsql
1.
ALTER TABLE data ALTER COLUMN meta_data SET DEFAULT <константа>;


Иначе делать хранимой процедурой.

p.s. Раз meta_data.id у вас типа bigserial, то вообще наверно логично, чтобы data.meta_data было bigint?


Можео ли сделать так чтоб поле meta_data автоматически заполнялось при появлении записи в поле id из таблицы meta_data .
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524538
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовТригернуя функция будет иметь следующий вид?
<>о каком триггере идёт речь ?
вы уж как-нибудь определитесь.


если речь о триггере на вью, и все три таблицы в нём (вью) представленны - то вполне вероятно и некоторое текстуальное совпадение с вашим вариантом. но отнюдт не полным, так как вместо бреда в виде

NEW.meta_data:=meta_data.id;
NEW.s_ep_mkd:=s_ep_mkd.id;

вам понадобится что-то другое.
например, если эти поля представленны в неназываемом вам (но подразумеваемом) вью, и называются как-то наподобие meta_data_id и s_ep_mkd_id, то текст бцудет примерно таков:

NEW.meta_data:=NEW.meta_data_id;
NEW.s_ep_mkd:=NEW.s_ep_mkd_id;

если же вы бредите совсем не об триггере на вставку в некий "обновляемый" вью, а о чём-то своём, о девичьем - то вот с этого и стоит начать -- что именно вы предполагаете заполнять значениями, в какой увязке с заполнением прочих таблиц ?

Нариман Алимурадов Тригер надо делать типа AFTER?
какой смысл определять значения полей вью в триггере AFTER ?
или вы не представляете чем after триггер отличается от BEFORE ?


вообще-то желательно сначала разогнать своих тараканов, т.е. поставить полностью задачу - а потом уточнять детали
а не наоборот - упрашивать сторонних людей прояснять девственный туман в вашей бестолковке.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524555
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов <>

Можео ли сделать так чтоб поле meta_data автоматически заполнялось при появлении записи в поле id из таблицы meta_data .
можно перестать бредить ?
запись появляется не "в поле" а "в таблице"
целиком.
как вариант - "во вью", как псевдо-таблице.

и в каком порядке вы хотите порождать запись в подчиненке при появлении записи в мастере ? чем должны заполняться прочие [ кроме id == fk] поля подчиненки в момент вставки чего-бы то ни было в мастер?


если вы конопатите связь 1:1 то не проще ли сделать все полями одной таблицы, по крайней мере, пока у вас в голове не прояснеет на счёт синтакса там и прочих чисто технических моментов ?
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524609
автор]о каком триггере идёт речь ?
вы уж как-нибудь определитесь.

тригер на обновление связанных полей таблицы data из соответствующих внешних ключей.

авторесли же вы бредите совсем не об триггере на вставку в некий "обновляемый" вью, а о чём-то своём, о девичьем - то вот с этого и стоит начать -- что именно вы предполагаете заполнять значениями, в какой увязке с заполнением прочих таблиц ?

то есть я добавляю записи в таблицу meta_data, при этом чтоб в связанной таблице data автоматически заполнялись поля на которые прописаны вшешние ключи. В моем случае поле meta_data/

авторкакой смысл определять значения полей вью в триггере AFTER ?
или вы не представляете чем after триггер отличается от BEFORE ?

При добавлении записи в meta_data.id, обноление поля data.id не будет производиться так как нарушается правило внешенего ключа, согласно которому значение выбирается из FOREIGN KEY, а оно у нас на момент вставки пустое.

P.S Не ругайте вы сильно( я только азы постигаю. Вопрос сформулировать даже с трудом получается.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524693
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
давайте по полочкам:Нариман Алимурадовавтор]о каком триггере идёт речь ?
вы уж как-нибудь определитесь.

тригер на обновление связанных полей таблицы data из соответствующих внешних ключей.
т.е. кто на ком стоял ?
ключ - это ссылка, не из каких ссылок ничего не триггерится.
триггер - это обработчик события изменения или вставки записи (а не поля) в таблицу

итак, про обработку какого события, в какой таблице, вы хотите вести речь ?

Нариман Алимурадовавторесли же вы бредите совсем не об триггере на вставку в некий "обновляемый" вью, а о чём-то своём, о девичьем - то вот с этого и стоит начать -- что именно вы предполагаете заполнять значениями, в какой увязке с заполнением прочих таблиц ?

то есть я добавляю записи в таблицу meta_data, при этом чтоб в связанной таблице data автоматически заполнялись поля на которые прописаны вшешние ключи. В моем случае поле meta_data

если вы добавляете "много записей" и хотите породить (на это событие вставки "много записей") одну запись где-то ещё - это не описывается соотношением типа мастер-слейв. (обслуживаемые ссылкой типа фк)


если вы хотите при вставке любой записи в мастер производить вставку новой записи в слейв (т.е. реализовать 1:1) то самое простое - добавить поля слейва в мастер, и не заморочиваться триггерами.

но можно и триггером, и даже after. Только закавыка в том, что NEW это поля обновляемой/создаваемой записи. Т.е. в вашем случае мастер-таблицы. А не подчиненки, которую вы хотите автоматом создать.


ну, а как узнать , какую запись (id) третьей таблицы вы хотите назначить в соотвествие с только что порождаемой вами (в триггере на первую ) запись второй -- это вообще уму не растяжимо.

Нариман Алимурадовавторкакой смысл определять значения полей вью в триггере AFTER ?
или вы не представляете чем after триггер отличается от BEFORE ?

При добавлении записи в meta_data.id, обноление поля data.id не будет производиться так как нарушается правило внешенего ключа, согласно которому значение выбирается из FOREIGN KEY, а оно у нас на момент вставки пустое.

P.S Не ругайте вы сильно( я только азы постигаю. Вопрос сформулировать даже с трудом получается.
ещё раз. запись добавляется не в (поле) "дата"."ид", а в (таблицу) "дата" целиком. говорить о добавление записи в поле - недопустимо.

о каом "обновлении" вы говорите в процессе добавления - я не понимаю

попытайтесь донести свою мысль более подробно


если же вас заботит добавление синхронно записи в слейв с ещё не закомиченным значением id из мастера - сделайте отложенную проверку констрейтов. для ФК её сделали давно.
см сабкляузы
Код: plaintext
 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
предложений CREATE TABLE |ALTER TABLE ... ADD CONSTRAINT
тут:
http://www.postgresql.org/docs/current/static/sql-createtable.html


и т.д. и т.п.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38524758
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов,

делайте два запроса из клиентского приложения. на каком языке программируете?

INSERT INTO meta_data( year, month,.. doc_type, vers_form ) VALUES ( $1, $2,.. $7, $8 ) RETURNING id;
INSERT INTO data( meta_data, s_ep_mkd ) VALUES ( $1, $2 );
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38525808
клиентское приложение .

На питоне буду писать.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38525811
клиентское приложение QGIS
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38525950
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовНа питоне буду писать.ну и прекрасно. с помощью какого модуля работаете с БД?

Нариман АлимурадовПри добавлении записи в meta_data.id, обноление поля data.id не будет производиться так как нарушается правило внешенего ключа, согласно которому значение выбирается из FOREIGN KEY, а оно у нас на момент вставки пустое.поэтому сначала добавляйте запись в таблицу meta_data, и только потом - в data.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38526881
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatНариман АлимурадовНа питоне буду писать.ну и прекрасно. с помощью какого модуля работаете с БД?

Нариман АлимурадовПри добавлении записи в meta_data.id, обноление поля data.id не будет производиться так как нарушается правило внешенего ключа, согласно которому значение выбирается из FOREIGN KEY, а оно у нас на момент вставки пустое.поэтому сначала добавляйте запись в таблицу meta_data, и только потом - в data.
вообще то всё и так номано работает.
Код: 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.
CREATE TABLE meta_data
(
  year integer NOT NULL,
  month integer NOT NULL,
  inn character varying NOT NULL,
  kpp character varying,
  ogrn character varying,
  adr_code character varying NOT NULL,
  doc_type integer NOT NULL,
  vers_form character varying NOT NULL,
  id bigserial NOT NULL,
  CONSTRAINT meta_data_pkey PRIMARY KEY (id )
)
;
CREATE TABLE data
(
  id bigserial NOT NULL,
  meta_data integer NOT NULL,
  s_ep_mkd integer,
  CONSTRAINT data_pkey PRIMARY KEY (id ),
  CONSTRAINT external_key1 FOREIGN KEY (meta_data)
      REFERENCES meta_data (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION/* ,
	CONSTRAINT external_key2 FOREIGN KEY (s_ep_mkd)
      REFERENCES s_ep_mkd (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE */
)
;
------------тест --------------
WITH imd AS (
INSERT INTO meta_data(
            year, month, inn, kpp, ogrn, adr_code, doc_type, vers_form, id)
    VALUES (2013, 12, 'inn', 'kpp', 'ogrn', 'adr_code', 0, 'vers_form',DEFAULT)
RETURNING id
)
INSERT INTO data(
            id, meta_data, s_ep_mkd)
    VALUES (DEFAULT ,(SELECT imd.id FROM imd), NULL --hz, как вы будете тут его определять
    )
;
SELECT * FROM meta_data m LEFT JOIN data d ON (m.id=d.meta_data);
-----------------------
2013;12;"inn";"kpp";"ogrn";"adr_code";0;"vers_form";1;1;1;


в чём у ТС проблема - так это с незнанием скуля. и с недодумыванием задач до конца.
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38527004
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqв чём у ТС проблема - так это с незнанием скуля. и с недодумыванием задач до конца.если работать из ЯП через ORM, то знание sql и не требуется. :)
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38527011
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторORM, то знание sql и не требуется. :)

а вот это, к сожалению, утопия
...
Рейтинг: 0 / 0
Автозаполнение связанных полей Postgresql.
    #38527097
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha TyurinавторORM, то знание sql и не требуется. :) а вот это, к сожалению, утопияда, конечно. и более того, при наличии нагрузки прходится пинать ORM, чтобы генерил эффективные sql запросы.

я имел в виду, что в случае не нагруженного проекта можно обойтись ORM и не задумываться об sql и эффективности.

PS: приходили начинающие програмеры на собеседование - с БД работал, django знаю, sql - нет. :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автозаполнение связанных полей Postgresql.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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