A tree is a connected graph with no cycles, so in tree(id int primary key, parentid int) , id must not be equal to parentid .
CHECK CONSTRAINT would seem a natural way to enforce this data integrity rule, but ...
CHECK CONSTRAINT , e.g.,...
create table tree( id int, parentid int default null, constraint check(id <> parentid) );But if ...
Insert TriggerWhenid is auto_increment, this query finds the next auto_increment value for table `tree` in schema `trees` ...
select auto_increment from information_schema.tables where table_name = 'tree' and table_schema = 'trees';... so an Insert Trigger to prevent cycles in a graph table would be ... delimiter ; drop trigger if exists tree_ins; delimiter go create trigger tree_ins before insert on tree for each row begin declare idnew int; set idnew = (select auto_increment from information_schema.tables where table_name = 'tree' and table_schema = 'trees' ); if new.parentid=idnew then signal sqlstate '45000' set message_text = 'tree parentid may not equal id'; end if; end go delimiter ; Update TriggerUpdates don't generate new auto_increment values, so the corresponding Update Trigger is simpler ...drop trigger if exists tree_upd; delimiter go create trigger tree_upd before update on tree for each row begin if new.parentid=new.id then signal sqlstate '45000' set message_text = 'tree parentid may not equal id'; end if; end$ delimiter ; Last updated 7 May 2024 |
![]() |