Skip site navigation (1) Skip section navigation (2)

Связь 1:1

From: Anton <anton200(at)gmail(dot)com>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Связь 1:1
Date: 2007-04-26 13:42:13
Message-ID: 8cac8dd0704260642i1ba422acw9398acacf70a25f@mail.gmail.com (view raw or flat)
Thread:
Lists: 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

Responses

pgsql-ru-general by date

Next:From: Kovalenko OlegDate: 2007-04-27 04:56:21
Subject: Re: Связь 1:1
Previous:From: Alexey KolosovDate: 2007-04-25 10:37:05
Subject: Re: Multi-Master asynchronous replication

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group