在更新前更新同一表中的不同行

dbf7pr2w  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(346)

我有一张有家庭关系的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触发器中?
它应该放在存储过程中吗?

dluptydi

dluptydi1#

触发器不能更改启动触发器的查询所引用的任何表中的数据。
这不是同一个问题,但我在这里更详细的回答是适用的。
更好的解决方案是创建一个单独的表来实际保存这些关系(而不是“birthdays”表中的多个引用字段,这些字段的名称显然越来越错误)。这张新table看起来像:

Person1_id INT(11) UNSIGNED NOT NULL
Person2_id INT(11) UNSIGNED NOT NULL
Relationship_id INT(11) UNSIGNED NOT NULL

关系id将引用一个新的 Relationships 包含方向项信息的表。示例:

1, "Parent", "Child"
2, "Spouse", "Spouse"
3, "Sibling", "Sibling"
4, "Aunt", "Niece"
etc....

... 尽管兄弟姐妹和姑姑侄女的关系可以用联结来计算。

相关问题