我可以在 MySQL 中向子项添加检查约束以检查其父项的值吗?
Can I add a check constraint to a child checking the value of its parent in 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)
之类的查询。这可能吗?还有其他选择吗?
检查约束不起作用解决方案是在之前创建触发器
insert 所以你检查值如果你发现一些错误的东西插入到相同的 table 中会导致 erreur in
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 ;
这就是我们现在的做法,希望检查约束在新版本中有效
我有一个类似的数据库,其中有两个表如下:
+----------------------+ +------------------------+
|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)
之类的查询。这可能吗?还有其他选择吗?
检查约束不起作用解决方案是在之前创建触发器 insert 所以你检查值如果你发现一些错误的东西插入到相同的 table 中会导致 erreur in
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 ;
这就是我们现在的做法,希望检查约束在新版本中有效