更新前更新同一表中的其他行

时间:2018-01-17 18:51:43

标签: mysql triggers

我有一张有家庭关系的桌子。其中一个关系是配偶。当插入或更新一行(单独的触发器)时,如果配偶的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 ;

问题:

  • 我可以更新触发器内的其他行吗?
  • 是否应该在BEFORE UPDATE / INSERT触发器或AFTER触发器中?
  • 它应该在存储过程中吗?

1 个答案:

答案 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....

...虽然兄弟姐妹和姨妈的关系可以用连接来计算。