私の質問を説明する前に、私の問題を説明するのに役立ついくつかのテーブル定義を以下に示します。
-- 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 テーブルには、Type_ID が Member_Types.ID と等しい Member_Infos テーブルに含めることができるレコードの最大数を表す整数を含む Member_Limit 列があります。
私はチェック制約を書くことができましたが、明らかに mysql はチェック制約を実施していません。挿入する前に、member_infos テーブル内のレコード数が <= Member_Types.Member_Limit であることを確認するトリガーを作成したいと思います。例: 上記のデータを使用すると、レコード 4 の Member_Limit = 5 になります。 Type_ID = 4 の Member_Infos テーブルに新しいレコードを挿入しようとすると、Member_Infos テーブル内の Type_ID <= 5 のレコード数がデータが挿入されます。それ以外の場合は拒否されます。アドバイスをいただければ幸いです。