Как записать ограничение относительно макс. количества строк в postgresql?

Серьезно, расширяемая платформа POCOs никогда не будет сериализировать к XML надежно. Я говорю это, потому что я могу гарантировать, что кто-то приедет, расширит Ваш класс и испортит его.

необходимо изучить использование XAML для сериализации графов объектов. Это разработано, чтобы сделать это, тогда как сериализация XML не.

сериализатор Xaml и deserializer обрабатывают дженерики без проблемы, наборов базовых классов и интерфейсов также (как долго, поскольку сами наборы реализуют IList или IDictionary). Существуют некоторые протесты, такие как маркировка Ваших свойств набора только для чтения с эти DesignerSerializationAttribute, но переделка Вашего кода для обработки этих угловых случаев не является этим трудно.

20
задан jeje 16 November 2009 в 16:58
поделиться

3 ответа

Квассной прав; триггер был бы лучшим способом добиться этого.

Вот код:

CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
DECLARE
    max_photo_count INTEGER := 10;
    photo_count INTEGER := 0;
    must_check BOOLEAN := false;
BEGIN
    IF TG_OP = 'INSERT' THEN
        must_check := true;
    END IF;

    IF TG_OP = 'UPDATE' THEN
        IF (NEW.owner != OLD.owner) THEN
            must_check := true;
        END IF;
    END IF;

    IF must_check THEN
        -- prevent concurrent inserts from multiple transactions
        LOCK TABLE photos IN EXCLUSIVE MODE;

        SELECT INTO photo_count COUNT(*) 
        FROM photos 
        WHERE owner = NEW.owner;

        IF photo_count >= max_photo_count THEN
            RAISE EXCEPTION 'Cannot insert more than % photos for each user.', max_photo_count;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER enforce_photo_count 
    BEFORE INSERT OR UPDATE ON photos
    FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();

Я включил блокировку таблицы, чтобы избежать ситуаций, когда два одновременных взаимодействия будут подсчитывать фотографии для пользователя, обратите внимание, что текущий счет на 1 ниже limit, а затем обе вставки, что приведет к превышению лимита на 1. Если вас это не беспокоит, лучше всего снять блокировку, поскольку она может стать узким местом при большом количестве вставок / обновлений.

26
ответ дан 30 November 2019 в 00:01
поделиться

Вы не можете записать такое ограничение в объявлении таблицы.

Есть несколько обходных путей:

  • Создайте триггер, который будет проверять количество фотографий для каждого пользователя
  • Создайте столбец photo_order , в котором будет сохранен порядок фотографий, сделайте (user_id, photo_order) UNIQUE и добавьте CHECK (photo_order BETWEEN 1 AND 10)
10
ответ дан 30 November 2019 в 00:01
поделиться

Мой ответ основан на этом совете на VIM Wiki. В этом ответе используется каталог «after», поэтому вам не придется возиться с предоставленными файлами подключаемых модулей для разных типов файлов.

Например, чтобы указать собственные настройки для файлов Python, создайте файл с именем python.vim для хранения ваших настроек Python:

setlocal expandtab
setlocal shiftwidth=4
setlocal softtabstop=4

Поместите этот файл в

  • ~ / .vim / after / ftplugin (Linux)
  • $ HOME / vimfiles / after / ftplugin (Windows)

И наконец, вы должны иметь это в своем .vimrc (Linux) или _vimrc (Windows):

2
ответ дан 30 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: