我有一张有家庭关系的table。其中之一就是配偶关系。插入或更新行(单独的触发器)时,如果配偶的id存在,我希望更新相关配偶记录中的id。
如果一个id为2的行被更新,并且其配偶id为3,我希望id为3的行的配偶id设置为2。
以下是表的架构:
CREATE TABLE IF NOT EXISTS `gohman_birthdays` (
`gb_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
`gb_created` TIMESTAMP DEFAULT '0000-00-00 00:00:00' COMMENT 'Timestamp when record was created',
`gb_modified` TIMESTAMP DEFAULT '0000-00-00 00:00:00' COMMENT 'Timestamp when record was last modified',
`gb_name` VARCHAR(30) NULL DEFAULT '' COMMENT 'Full Name',
`gb_lname` VARCHAR(30) NULL DEFAULT 'Gohman' COMMENT 'Last Name',
`gb_maidenname` VARCHAR(30) NULL DEFAULT '' COMMENT 'Maiden Name',
`gb_nickname` VARCHAR(30) NULL DEFAULT '' COMMENT 'Nick-Name',
`gb_email` VARCHAR(100) NULL DEFAULT '' COMMENT 'Email Address',
`gb_phone1` VARCHAR(30) NULL DEFAULT '' COMMENT '1st Phone',
`gb_phone2` VARCHAR(30) NULL DEFAULT '' COMMENT '2nd Phone',
`gb_dob` DATE NULL DEFAULT 1 COMMENT 'Date Of Birth',
`gb_dod` DATE NULL DEFAULT 1 COMMENT 'Date Of Death',
`gb_fatherid` INT(11) NULL DEFAULT NULL COMMENT 'FK to father parent ID',
`gb_motherid` INT(11) NULL DEFAULT NULL COMMENT 'FK to mother parent ID',
`gb_spouseid` INT(11) NULL DEFAULT NULL COMMENT 'FK to mother parent ID',
`gb_gender` TINYINT(1) NULL DEFAULT NULL COMMENT '1 if male, 0 if female',
`gb_deceased` TINYINT(1) NULL DEFAULT 0 COMMENT '0 or 1 flag, 1 if deceased',
PRIMARY KEY (`gb_id`),
KEY `idx_gb_nickname` (`gb_nickname`),
KEY `idx_gb_email` (`gb_email`),
KEY `idx_gb_name` (`gb_name`),
KEY `idx_gb_dob` (`gb_dob`),
)
ENGINE=MyISAM
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci
COMMENT '';
到目前为止,我已经掌握了一些关于触发器的信息:
-- ==============================================================================================
-- TRIGGER: Update created and modified timestamps on gohman_birthdays
-- ==============================================================================================
DELIMITER |
DROP TRIGGER IF EXISTS `gohman_birthdays_CreatedTS`|
DROP TRIGGER IF EXISTS `gohman_birthdays_ModifiedTS`|
CREATE TRIGGER `gohman_birthdays_CreatedTS` BEFORE INSERT ON `gohman_birthdays`
FOR EACH ROW
BEGIN
SET NEW.`gb_created` = CURRENT_TIMESTAMP;
SET NEW.`gb_modified` = CURRENT_TIMESTAMP;
END|
CREATE TRIGGER `gohman_birthdays_ModifiedTS` BEFORE UPDATE ON `gohman_birthdays`
FOR EACH ROW
BEGIN
SET NEW.`gb_modified` = CURRENT_TIMESTAMP;
IF NOT NEW.`gb_spouseid` IS NULL THEN
UPDATE `gohman_birthdays` a
SET a.`gb_spouseid` = NEW.`gb_id`
WHERE a.`gb_id` = NEW.`gb_spouseid`;
END IF
END|
DELIMITER ;
问题:
我可以更新触发器中的其他行吗?
它应该在before update/insert触发器中还是在after触发器中?
它应该放在存储过程中吗?
1条答案
按热度按时间dluptydi1#
触发器不能更改启动触发器的查询所引用的任何表中的数据。
这不是同一个问题,但我在这里更详细的回答是适用的。
更好的解决方案是创建一个单独的表来实际保存这些关系(而不是“birthdays”表中的多个引用字段,这些字段的名称显然越来越错误)。这张新table看起来像:
关系id将引用一个新的
Relationships
包含方向项信息的表。示例:... 尽管兄弟姐妹和姑姑侄女的关系可以用联结来计算。