Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написать ограничение на таблицу / 10 сообщений из 10, страница 1 из 1
14.02.2014, 18:24:06
    #38561422
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Доброго дня,

подскажите пожалуйста, как написать ограничение на таблицу, используя constraints или INDEX.

Есть таблица:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
-- Table: "DOCTOR_PHOTOS"

-- DROP TABLE "DOCTOR_PHOTOS";

CREATE TABLE "DOCTOR_PHOTOS"
(
  "ID" bigint NOT NULL DEFAULT nextval('"DOCTOR_PHOTOS_seq"'::regclass),
  "DOCTOR_ID" bigint NOT NULL,
  "PHOTO" character varying(64),
  "IS_PRIMARY" boolean,
  "EXPIRATION_TIME" timestamp without time zone,
  "IS_ICON" boolean,
  CONSTRAINT "DOCTOR_PHOTOS_pkey" PRIMARY KEY ("ID" ),
  CONSTRAINT "DOCTOR_ID3" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "DOCTOR_PHOTOS"
  OWNER TO postgres;

-- Index: "fki_DOCTOR_ID3"

-- DROP INDEX "fki_DOCTOR_ID3";

CREATE INDEX "fki_DOCTOR_ID3"
  ON "DOCTOR_PHOTOS"
  USING btree
  ("DOCTOR_ID" );

-- Index: original_is_icon_photo

-- DROP INDEX original_is_icon_photo;

CREATE UNIQUE INDEX original_is_icon_photo
  ON "DOCTOR_PHOTOS"
  USING btree
  ("DOCTOR_ID" , "IS_ICON" )
  WHERE "IS_ICON" = true;

-- Index: original_primary_photo

-- DROP INDEX original_primary_photo;

CREATE UNIQUE INDEX original_primary_photo
  ON "DOCTOR_PHOTOS"
  USING btree
  ("DOCTOR_ID" , "IS_PRIMARY" )
  WHERE "IS_PRIMARY" = true;



Смысл ограничения:
для каждого doctor_id должна быть только одна запись с IS_ICON=true.
(другими словами не должно быть такого doctor_id без IS_ICON=true)

Написал пока только, что для каждого doctor_id должно быть не более одной записи с IS_ICON=true:

Код: plsql
1.
2.
3.
4.
5.
CREATE UNIQUE INDEX original_is_icon_photo
  ON "DOCTOR_PHOTOS"
  USING btree
  ("DOCTOR_ID" , "IS_ICON" )
  WHERE "IS_ICON" = true;



Но как написать, что одна-то запись быть должна?
...
Рейтинг: 0 / 0
15.02.2014, 15:42:29
    #38561845
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Сложно понять ваше ограничение.
По-моему здесь нужен table trigger, который бы при каждом INSERT, UPDATE и DELETE решал, кому из докторов приписать IS_ICON=true (если я правильно понял описанное ограничение)
...
Рейтинг: 0 / 0
15.02.2014, 23:05:26
    #38562016
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Viacheslav_mihalich,


5.3.3. Unique Constraints
вам в зубы.
...
Рейтинг: 0 / 0
15.02.2014, 23:06:44
    #38562019
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Я, кстати, когда начал работать с констрэйнтами - это и были constraint unique. Удивительно, что у кого-то не так.
...
Рейтинг: 0 / 0
15.02.2014, 23:12:11
    #38562025
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
На самом деле, тут не все так очевидно, но думать сейчас больно. Поэтому отложим этот вопросец на потом.
...
Рейтинг: 0 / 0
16.02.2014, 07:52:03
    #38562126
Написать ограничение на таблицу
Viacheslav_mihalich,
вы опять решаете задачу не стой стороны
в таблице DOCTOR должно быть поле icon_id NOT NULL, указывающее (ссылающееся) именно на то DOCTOR_PHOTOS (id), которое назначено иконой. (результат - ссылка на иконку есть, и она одна).

всё.


хотя имеете право грызть кактус -- написать булеву ф-ю (с exists ... ) и повесить чек c этой ф-й на DOCTOR (что есть хотя бы одна, такая что....) -- в довесок к вашему уникъю.
...
Рейтинг: 0 / 0
16.02.2014, 23:24:48
    #38562527
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Спасибо всем ответившим за предложенные варианты!
...
Рейтинг: 0 / 0
17.02.2014, 18:17:25
    #38563502
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
йокарный бабай,

>>вы опять решаете задачу не стой стороны
>>в таблице DOCTOR должно быть поле icon_id NOT NULL, указывающее (ссылающееся) именно на то DOCTOR_PHOTOS (id), которое >>назначено иконой. (результат - ссылка на иконку есть, и она одна).

Я бы так и сделал, если бы у каждого доктора была бы только одна фотка, она же иконка.
В данном случае у докторов должно быть много фотографий, одна из которых будет иконкой.
В любой момент времени можно будет поменять иконку с одной фотки на другую. И она должна быть одна.
Так что придется, как вы посоветовали, грызть кактус )).
...
Рейтинг: 0 / 0
17.02.2014, 19:14:31
    #38563577
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Viacheslav_mihalichйокарный бабай,

>>вы опять решаете задачу не стой стороны
>>в таблице DOCTOR должно быть поле icon_id NOT NULL, указывающее (ссылающееся) именно на то DOCTOR_PHOTOS (id), которое >>назначено иконой. (результат - ссылка на иконку есть, и она одна).

Я бы так и сделал, если бы у каждого доктора была бы только одна фотка, она же иконка.
В данном случае у докторов должно быть много фотографий, одна из которых будет иконкой.
В любой момент времени можно будет поменять иконку с одной фотки на другую. И она должна быть одна.
Так что придется, как вы посоветовали, грызть кактус )).перечитайте и попробуйте понять что написал йокарный бабай
...
Рейтинг: 0 / 0
17.02.2014, 19:24:26
    #38563590
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Написать ограничение на таблицу
Viacheslav_mihalich... у докторов должно быть много фотографий, одна из которых будет иконкой.
В любой момент времени можно будет поменять иконку с одной фотки на другую. И она должна быть одна.вариант от йокарный бабай подходит как раз для этой ситуации
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написать ограничение на таблицу / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]