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
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 |