Обновите другую строку в той же таблице до обновления

0

У меня есть таблица с семейными отношениями. Одним из таких отношений является супруга. Когда строка вставлена или обновлена (отдельные триггеры), если присутствует ID супруга, я хочу обновить идентификатор в соответствующей записи супруга.

IOW, если строка с идентификатором 2 обновлена и имеет и spouse_id из 3, я хочу, чтобы строка с идентификатором 3 имела идентификатор супруга, установленный в 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 ;

Вопросы:

  • Могу ли я обновить другую строку внутри триггера?
  • Должна ли она быть в триггере UPDATE/INSERT или триггера AFTER?
  • Должно ли это быть в хранимой процедуре?
Теги:
triggers

1 ответ

0
Лучший ответ

Триггер не может изменить данные в любой таблице, на которую ссылается запрос, инициировавший триггер.

Это не тот же вопрос, но мой более подробный ответ здесь применим.


Лучшим решением было бы сделать отдельную таблицу для фактического удержания отношений (а не нескольких ссылочных полей в таблице, по-видимому, все чаще называемой "дни рождения"). Эта новая таблица будет выглядеть примерно так:

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

... хотя братья и сестры и отношения с тетей-племянницей могли быть рассчитаны с помощью объединений.

  • 0
    @uuerdo, спасибо за быстрый ответ. Я подумал, что смогу найти братьев и сестер и т. Д. Через соединения, и просто пытался избежать другого стола. Что касается названия таблицы, то это основная функция - записывать дни рождения членов семьи. Отношения и тому подобное просто добавить в информацию. Я добавлю таблицу для отношений. Еще раз спасибо за информацию!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню