Могу ли я использовать ограничение NOT NULL с условием? в PostgreSQL - PullRequest
0 голосов
/ 03 января 2011

Я новичок в PostgreSQL, есть ли способ сделать некоторые кортежи не удаляемыми, если выполняется какое-то условие?если быть точным, предположим, что у меня есть:

Table Males (Name_A, Profession)

Table Students (Names_B, Date_birth)

, где Names_B ссылается на Names_A, как я могу убедитьсячто только "Names_A" не удаляются ", у которых Date_birth =" xx / yy / zz "

извините, если я не могу это четко объяснить, не нашел ничего в DDL, используя ограничение NOT NULL, чтобы написать это.

Заранее спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 03 января 2011
CREATE FUNCTION protect_delete() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    IF OLD.date_birth = 'xx/yy/zz' THEN  -- don't actually use this date format
        RETURN NULL;  -- don't delete
    ELSE
        RETURN OLD;
    END IF;
END;
$$;

CREATE TRIGGER protect_delete BEFORE DELETE ON students FOR EACH ROW
    EXECUTE PROCEDURE protect_delete();
0 голосов
/ 04 января 2011

Вы можете использовать правило PostgreSQL:

create rule rule_test as 
  on delete to test 
  -- old is a reference to your table 
  where old.birth = '2011-1-1' -- or whatever condition you want 
  do instead nothing;

Одна большая таблица может работать быстрее, так как это изменит сам запрос и перезапишет запрос с условием вместо проверки каждой строки. (Триггеры могут быть более мощными и их легче понять, если вы планируете делать много такого рода вещей.)

0 голосов
/ 03 января 2011

См. Документация по триггерам Postgres для получения информации о создании триггеров. Похоже, вы хотите триггер уровня строки.

"Триггер на уровне строки, сработавший перед операцией ... может вернуть NULL, чтобы пропустить операцию для текущей строки. Это указывает исполнителю не выполнять операцию на уровне строки, которая вызвала триггер (вставка или изменение определенная строка таблицы). "

Таким образом, в тесте триггера для вашего состояния и возврата нуля, чтобы предотвратить удаление, верните строку триггера, чтобы продолжить удаление.

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