Связь 1:1
От | Anton |
---|---|
Тема | Связь 1:1 |
Дата | |
Msg-id | 8cac8dd0704260642i1ba422acw9398acacf70a25f@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Связь 1:1
(Kovalenko Oleg <ok@calculate.ru>)
|
Список | pgsql-ru-general |
Hi. Подскажите как реализовать "алгоритм" связи "один к одному", практически. Вот есть таблица статеек =# \d articles Table "public.articles" Column | Type | Modifiers ------------------+-----------------------------+--------------------------------------------------------------- article_id | integer | not null default nextval('articles_article_id_seq'::regclass) subj | character varying(255) | not null default 'nosubj'::character varying body | text | not null default 'notext'::text Indexes: "articles_pkey" PRIMARY KEY, btree (article_id) И таблица картинок к ним =# \d article_imgnames Table "public.article_imgnames" Column | Type | Modifiers --------------+------------------------+---------------------------------------- article_id | integer | not null img | character varying(255) | not null default ''::character varying img_mini | character varying(255) | not null default ''::character varying img_mainpage | character varying(255) | not null default ''::character varying Foreign-key constraints: "article_imgnames_article_id_fkey" FOREIGN KEY (article_id) REFERENCES articles(article_id) ON UPDATE CASCADE ON DELETE CASCADE Чтобы соблюсти 1:1 я добавляю уникальный индекс ALTER TABLE article_imgnames ADD UNIQUE(article_id); Теперь вставляю статью и картинки к ней (это на PHP). Примерно так BEGIN; INSERT INTO articles VALUES(DEFAULT, 'Заголовок', 'Текст ее'); -- Затем извлекается SELECT currval('articles_article_id_seq') -- и он подсовывается в следующий инсерт INSERT INTO article_imgnames(article_id, img, img_mini, img_mainpage) VALUES('326','','',''); COMMIT; Однако =# INSERT INTO article_imgnames(article_id, img, img_mini, img_mainpage) VALUES('326','','',''); ERROR: insert or update on table "article_imgnames" violates foreign key constraint "article_imgnames_article_id_fkey" DETAIL: Key (article_id)=(326) is not present in table "articles". То есть получается, что в транзакции нельзя с UNIQUE. Если убрать UNIQUE, то соответственно могут "возникнуть" дубликаты. А если убрать транзакцию могут возникнуть "обрывы" - и статьи без картинок. Как правильно реализовать? Может зря разбил на 2 таблицы (это я так пытался "грамотно" организовать схему...) -- engineer
В списке pgsql-ru-general по дате отправления: