所以在我解释我的问题之前,这里有几个精简的表定义来帮助说明我的问题:
-- Holds data about different memberships
CREATE TABLE IF NOT EXISTS `Member_Types` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(20) NOT NULL,
`Description` VARCHAR(255) NOT NULL,
`Member_Limit` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY( `ID` )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `Member_Types` ( `ID`, `Name`, `Description`, `Member_Limit` ) VALUES
( 1, 'General Member', 'Description of this membership.', 00 ),
( 2, 'Extended Member', 'Description of this membership.', 00 ),
( 3, 'Premium Member', 'Description of this membership.', 00),
( 4, 'General Administrator', 'Description of this membership.', 05 ),
( 5, 'Master Administrator', 'Description of this membership.', 01 );
-- Stores the basic data about our site members
CREATE TABLE IF NOT EXISTS `Member_Infos` (
`ID` BIGINT(8) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
`Username` VARCHAR(30) NOT NULL UNIQUE,
`Password` CHAR(41) NOT NULL,
`EmailAddr` VARCHAR(100) NOT NULL,
`Type_ID` INT UNSIGNED NOT NULL,
`Salt_ID` BIGINT(8) UNSIGNED ZEROFILL NOT NULL,
PRIMARY KEY( `ID` ),
FOREIGN KEY( `Type_ID` ) REFERENCES `Member_Types` ( `ID` )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Member_Infos 表包含绑定 Member_Infos.Type_ID = Member_Types.ID 的外键
Member_Types 表有一个列 Member_Limit,它包含一个整数,表示 Member_Infos 表可以包含的最大记录数,其中 Type_ID 等于 Member_Types.ID
我能够编写一个检查约束,但显然 mysql 没有检查约束。我想编写一个触发器,在插入之前检查 member_infos 表中的记录数是否 <= Member_Types.Member_Limit。例如:使用上面的数据,记录 4 的 Member_Limit = 5。如果尝试将新记录插入到 Type_ID = 4 的 Member_Infos 表中,并且在 Member_Infos 表中 Type_ID <= 5 的记录计数比数据被插入,否则被拒绝。任何建议将不胜感激。