2016-07-15 6 views
1

У меня аналогичная база данных с двумя таблицами следующим образом:Могу ли я добавить ограничение проверки для дочернего элемента, проверяющего значение его родителя в MySQL?

+----------------------+   +------------------------+ 
|Persons    |   |phones     | 
+----------------------+   +------------------------+ 
|id  int   +-----+  |id   int   | 
|name  varchar(100) |  +---->+person_id int   | 
|allowed tinyint(1) |   |number  int   | 
+----------------------+   +------------------------+ 

Один человек может иметь столько телефонов, как он хочет, но он должен быть разрешен к нему (разрешено> 0).

Итак, я создал обе таблицы, используя

CREATE TABLE `phones` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `persons_id` int(11) DEFAULT NULL, 
    `phonenumber` int(5) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `phones_ibfk_1` (`persons_id`), 
    CONSTRAINT `phones_ibfk_1` FOREIGN KEY (`persons_id`) REFERENCES `persons` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8` 

Но это не проверить, что я хочу. Что я хочу знать, если это возможно, сделайте запрос вроде ALTER TABLE phones ADD CONSTRAINT chk_person CHECK (persons.allowed > 0). Это возможно? Есть еще одна альтернатива?

+0

Бесцельное усилие. Если 'allowed' равно' 0', то в вашем коде serveride просто не выполняются вставки. Реляционные базы данных заботятся о ** отношениях **, а не ** разрешениях **. Кроме того, если у человека есть 'n' записи в' phone' и вы устанавливаете '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Вам не нужно использовать РСУБД, чтобы делать что-то отдельное, оно заботится о данных, а не о том, что кто-то может или не может сделать. – Mjh

+0

@Mjh DB заботится о целостности данных. –

+0

@Golinmarq Вам, вероятно, понадобится триггер, чтобы справиться с этим ограничением. –

ответ

1

проверочное ограничение не работает решение, чтобы создать триггер, прежде чем вставки, так что вы проверить значения, если вы найдете что-то wron делать вставки в той же таблице, что вызовет ERREUR в

DELIMITER || 
CREATE TRIGGER trigger_check before insert ON phones FOR EACH ROW 
begin 
DECLARE is_allowed boolean; 
select allowed into @is_allowed from Persons where id = new.person_id; 
if @is_allowed <1 then 
    insert into phones values ('','','',''); #make erreur doesn't metter 
    end if ; 
end || 
DELIMITER ; 

вот как мы это делаем сейчас, надеемся, что проверка работы ограничения в новых версиях

+0

Спасибо! Это может быть решение – Golinmarq

+0

да надеюсь, что проверка ограничения работы в один прекрасный день спасибо – Cherif

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

  • Нет связанных вопросов^_^