Связь 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 по дате отправления:

Предыдущее
От: Alexey Kolosov
Дата:
Сообщение: Re: Multi-Master asynchronous replication
Следующее
От: Kovalenko Oleg
Дата:
Сообщение: Re: Связь 1:1