Связь 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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-ru-general by date

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