Добавить ограничение, которое проверяет сумму - PullRequest
5 голосов
/ 15 мая 2011

Я пытаюсь добавить ограничение в таблицу, проверив, что сумма значения <100. </p>

Это моя схема:

  CREATE TABLE Works  (
     eid      INTEGER,
     did      INTEGER,
     pct_time INTEGER,
     PRIMARY KEY (eid,did),
     FOREIGN KEY (eid) REFERENCES Employee(eid),
     FOREIGN KEY (did) REFERENCES Dept(did)
  );

Мне нужно проверить, что сумма pct_time для каждого eid <= 100. </p>

Например

eid --- did ---- pct_time
0 ----- a ------- 50
0 ----- d ------- 40
0 ----- c ------- 20
1 ----- a ------- 90
1 ----- b ------- 10
2 ----- d ------- 40
2 ----- a ------- 20

Здесь, должно быть, произошла ошибка, когда я добавил третью запись для eid 0 в качестве суммы> 100.
Было бы хорошо для EID 1 и 2, как pct_time <= 100 <BR> Как это можно сделать?

Пока все, что я сделал, это

ALTER TABLE Works
ADD CONSTRAINT c1
CHECK SUM(pct_time) < 100

1 Ответ

4 голосов
/ 15 мая 2011

Вы должны использовать триггер для этого.Убедитесь, что SELECT SUM(pct_time) FROM Works GROUP BY eid имеет какие-либо значения, которые превысят 100 после вашей вставки.Если это так, выведите ошибку.

Вы знакомы с триггерами?Какую систему баз данных вы используете?

EDIT: ознакомьтесь с документацией по триггерам здесь .По сути, вы хотите что-то вроде этого:

CREATE TRIGGER Work_insert_trigger
BEFORE INSERT ON Works
FOR EACH ROW
EXECUTE PROCEDURE check_sum_work();

Тогда ваша check_sum_work() процедура проверит, есть ли SUM (pct_time)> 100.

Здесь - этодокументация для процедур триггера, обратите внимание на специальную переменную NEW, которая позволяет выделить вставляемый элемент.Итак, вы захотите SELECT SUM(pct_time) FROM Works WHERE eid = NEW.eid и посмотрите, будет ли эта сумма + NEW.pct_time больше 100.

Это может звучать довольно сложно, если вы никогда раньше не видели триггеров, но на самом деле это довольно мощный механизмчто вы научитесь ценить.:)

Здесь - еще один пример использования триггеров PostgeSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...