Обсуждение: Связь 1:1

Поиск
Список
Период
Сортировка

Связь 1:1

От
Anton
Дата:
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

Re: Связь 1:1

От
Kovalenko Oleg
Дата:
В сообщении от 26 апреля 2007 17:42 Anton написал(a):
> Hi.
>
> Подскажите как реализовать "алгоритм" связи "один к одному", практически.
> Вот есть таблица статеек
>
> Теперь вставляю статью и картинки к ней (это на PHP). Примерно так
> BEGIN;
  SELECT nextval('articles_article_id_seq')
> INSERT INTO articles VALUES(его сюда, 'Заголовок', 'Текст ее');
> -- Затем извлекается
> -- и он подсовывается в следующий инсерт
> INSERT INTO article_imgnames(и сюда тоже, img, img_mini, img_mainpage)
> VALUES('326','','','');
> COMMIT;
--
Kovalenko Oleg
ok@calculate.ru
http://www.calculate.ru
+7 812 336-36-32
+7 495 772-76-78