2016-07-15 64 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',那么在你的服务器端代码中就不要执行插入操作。关系数据库负责**关系**,而不是**权限**。此外,如果某人在'phones'中有'n'记录,并且您将其'allowed'设置为'0',则您的服务器端代码可以简单地忽略对'phones'的查询并且不显示任何内容。您不必使用RDBMS来完成每一件事,它只需要处理数据,而不是某人可以或不可以做的事情。 – 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