2016-06-28 3 views
2

Представьте создать некоторую таблицу:Рекомендации по утверждению некоторых условий в SQL при создании таблицы?

CREATE TABLE mytable AS 
... 

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

SELECT count(*) 
FROM mytable 
WHERE something_horrible_is_true 

Есть ли стандартный рекомендованный способ генерации ошибки здесь, если счетчик не равен нулю? Чтобы что-то произошло, чтобы, если я выполняю этот запрос проверки работоспособности, используя java.sql.Statement, запускается SQLException?

Это разумный подход? Или это лучший способ обеспечить, чтобы какое-то условие всегда было истинным при создании таблицы? (Я использую Postgresql.)

+3

Поиск реляционных ограничений, проверка ограничений, а не нулевое ограничение и т. Д. –

ответ

1

Создать функцию, чтобы поднять исключение:

create or replace function raise_error(text) returns varchar as $body$ 
begin 
    raise exception '%', $1; 
    return null; 
end; $body$ language plpgsql volatile; 

Затем вы можете использовать его в обычных SQLs:

SELECT case when count(*) > 0 then raise_error('something horrible is true!') end 
FROM mytable 
WHERE something_horrible_is_true 

Здесь вы получите исключение SQL, если есть строки, которые удовлетворяют условию something_horrible_is_true ,

Есть также несколько более сложных примеров использования: рассчитывать или подняться исключение, когда ничего не найдено

SELECT 
    case 
    when count(*) = 0 then raise_error('something horrible is true!')::int 
    else count(*) 
    end 
FROM mytable 
WHERE something_horrible_is_true 

Returns.

update mytable set 
    mydatefield = 
    case 
     when mydatefield = current_date then raise_error('Can not update today''s rows')::date 
     else '1812-10-10'::date 
    end; 

Предотвращает обновить некоторые строки (это несколько надуманный пример, но он показывает еще один способ использования)
... и так далее.

1

Вы знакомы с триггерами? Postresql обеспечивает хорошую поддержку для триггеров, особенно используя pgsql laguange.

Триггер - это функция (проверка), которая всегда запускается в событии: вставка, обновление, удаление. Вы можете вызвать функцию до или после события.

Я верю, что когда вы знаете эту концепцию, вы можете найти онлайн-учебник, который поможет вам достичь своей цели.

Общий подход может выглядеть следующим образом:

CREATE FUNCTION trigger_function() RETURN trigger AS 
$$ 
DECLARE c integer; 
BEGIN 
SELECT count(*) into c FROM mytable WHERE something_horrible_is_true; 
IF c>0 then RAISE EXCEPTION 'cannot have a negative salary'; 
END IF; 
return new; 
END; 
$$ LANGUAGE plpgsql; 

А потом вы выполняете

CREATE TRIGGER trigger_name BEFORE INSERT 
    ON table_name 
    FOR EACH ROW 
    EXECUTE PROCEDURE trigger_function() 

Обе секции кода являются pqsql.

Смежные вопросы