2016-02-09 3 views
1

Этот вопрос упрощен для уменьшения помех.Как проверить, имеет ли объект внешнего ключа определенный тип

В моей базе данных У меня есть 2 стола. 1 таблица «продукт» и 1 таблица «уведомление». Этот продукт может быть 3-х типов, определенных перечислением (ENUM('SERVER', 'SERVICE', 'APPLICATION')).

Уведомление содержит ForeignKey продукта, его идентификатор.

Когда я создаю уведомление, я хотел бы проверить, имеет ли данный ForeignKey тип «ПРИМЕНЕНИЕ». Могу ли я выполнить такую ​​проверку? Если да, то это делается с помощью CHECK?

Насколько я знаю, единственное, что я мог проверить это значение (например CHECK(foo > 0))

ответ

1

Это проще всего сделать, это триггер Before Insert и второй один Before Update.

Вы можете сделать SELECT ключа своего иностранца, чтобы проверить его в триггере и выпустить сообщение об ошибке.

Взгляните на 2-м ответе CHECK constraint in MySQL is not working

Как это:

DELIMITER $$ 
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test` 
FOR EACH ROW 
BEGIN 
    IF CHAR_LENGTH(NEW.ID) < 4 THEN 
     SIGNAL SQLSTATE '12345' 
      SET MESSAGE_TEXT := 'check constraint on Test.ID failed'; 
    END IF; 
END$$ 
DELIMITER ; 
+0

. Пока это кажется хорошим решением. Если никакой другой ответ не будет опубликован, это будет мой путь. Но другой вариант, реализующий CHECK или CONSTRAINT в CREATE TABLE, не является жизнеспособным вариантом? – creulcat

+0

Кажется, что ваш лучший выбор imo – Anton

+1

@creulcat, насколько я знаю MySql, нет другого способа сделать дистанционную проверку ограничений, чем с помощью триггера ... – Blag

0

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

Заполните ваши таблицы, а затем используйте предложение where, чтобы отфильтровать результаты, которые вы не хотите. Вы не указали полную информацию о своей таблице, поэтому я приведу простой пример того, что вы хотите сделать. Моим перечислением является столбец типа.

В упрощенном виде:

  SELECT * 
      FROM products 
      WHERE type = 'APPLICATION' 
+0

Это действительно возможно, и мое текущее решение, но мне было интересно, если это было возможно, чтобы добавить дополнительный уровень безопасности в самой базе данных, а не в инструкции 'INSERT'. – creulcat

+0

Можете ли вы пояснить, что вы имеете в виду? в частности, что вы хотите сделать? – Anton

+0

Очень простой пример: 'CREATE TABLE продукты ( product_no целое, название текста, цены цифровой ЧЕК (цена> 0) );' В этом примере база данных гарантирует, что цена всегда '> 0' То, что я пытаюсь достичь, - это такая же проверка, когда база данных гарантирует, что внешний ключ всегда будет от типа 'APPLICATION' – creulcat

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