powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написать ограничение на таблицу
10 сообщений из 10, страница 1 из 1
Написать ограничение на таблицу
    #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
Написать ограничение на таблицу
    #38561845
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сложно понять ваше ограничение.
По-моему здесь нужен table trigger, который бы при каждом INSERT, UPDATE и DELETE решал, кому из докторов приписать IS_ICON=true (если я правильно понял описанное ограничение)
...
Рейтинг: 0 / 0
Написать ограничение на таблицу
    #38562016
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav_mihalich,


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

всё.


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

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

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

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

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


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