我有一张有家庭关系的桌子。其中一个关系是配偶。当插入或更新一行(单独的触发器)时,如果配偶的ID存在,我想更新相关配偶记录中的ID。
IOW,如果更新ID为2的行并且spouse_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 ;
问题:
答案 0 :(得分:0)
触发器无法更改启动触发器的查询引用的任何表中的数据。
这不是同一个问题,但我更详细的回答here适用。
更好的解决方案是制作一个单独的表来实际保存关系(而不是显然越来越错误的“生日”表中的几个参考字段)。 这个新表看起来像:
Person1_id INT(11) UNSIGNED NOT NULL
Person2_id INT(11) UNSIGNED NOT NULL
Relationship_id INT(11) UNSIGNED NOT NULL
Relationship_id将引用一个新的Relationships
表,其中包含有关方向性术语的信息。
例子:
1, "Parent", "Child"
2, "Spouse", "Spouse"
3, "Sibling", "Sibling"
4, "Aunt", "Niece"
etc....
...虽然兄弟姐妹和姨妈的关系可以用连接来计算。