Nano Hash - криптовалюты, майнинг, программирование

Запретить пользователям обновлять столбец, если другой столбец пуст?

У меня есть mytable, который имеет 3 целочисленных поля: id, status, project_id.

Я говорил людям, что они не должны повышать статус выше 4, пока ему не будет присвоено значение project_id. Естественно, люди не слушают, и тогда в будущем возникают проблемы.

Есть ли способ вернуть ошибку, если кто-то попытается обновить статус с 4 на 5, а столбец project_id равен null? Мне все еще нужно, чтобы люди могли обновлять статус с 2 или 3 на статус 4, независимо от того, имеет ли он project_id.


Ответы:


1

Вы можете использовать CHECK ограничение, предложенное @stickbit, если вам нужно очень простое чеки.

Если вам нужна более сложная логика, вы можете использовать TRIGGER функциональные возможности.

CREATE FUNCTION check_status()
  RETURNS trigger AS
$mytrigger$
BEGIN
   IF OLD.status = 4 AND NEW.status >= 5 AND NEW.project_id IS NULL THEN
      RAISE EXCEPTION 'Project ID must be assigned before progressing to status 5';
   END IF;
   RETURN NEW;
END
$mytrigger$
LANGUAGE plpgsql;

CREATE TRIGGER project_id_check
BEFORE UPDATE ON "MyTable"
FOR EACH ROW EXECUTE PROCEDURE check_status();
21.01.2019

2

Как насчет проверочного ограничения на таблицу:

CHECK (project_id IS NOT NULL OR status < 5)
21.01.2019
  • Это похоже на путь, если данные еще не испорчены. Пишет, что ряды нарушают проверку. Я пойду с приведенным ниже решением, спасибо 21.01.2019
  • @Luffydude Если данные уже испорчены, вам действительно следует очистить свои данные. Сначала поместите новые ограничения/триггеры, затем вернитесь и очистите данные. 21.01.2019
  • @AleksG, если у вас есть время очистить 1 тыс. строк, дайте мне знать, в конце концов люди исправят свои данные. На данный момент предложенного ниже НЕДЕЙСТВИТЕЛЬНО достаточно, чтобы ваш запрос работал. 22.01.2019

  • 3

    Если у вас есть данные, нарушающие желаемые правила, вы все равно можете использовать CHECK ограничение, как демонстрируется sticky bit. Просто сделайте его NOT VALID:

    ALTER TABLE mytable ADD CONSTRAINT project_id_required_for_statusproject_idor_higher
    CHECK project_id IS NOT NULL OR status < 5) NOT VALID;

    Затем ограничение применяется только к последующим вставкам и обновлениям. Существующие строки игнорируются. (Но любое новое обновление должно исправлять неверные значения, иначе произойдет сбой.)

    У вас также должно быть FOREIGN KEY ограничение, обеспечивающее ссылочная целостность для project_id, иначе ограничение можно легко обойти с помощью фиктивных значений.

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

    Когда все строки будут приведены в соответствие с новым правилом, вы можете VALIDATE ограничение:

    ALTER TABLE mytable VALIDATE CONSTRAINT project_id_required_for_status_5_or_higher;
    

    Более:

    21.01.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..