У меня есть таблица с семейными отношениями. Одним из таких отношений является супруга. Когда строка вставлена или обновлена (отдельные триггеры), если присутствует 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 ;
Вопросы:
Триггер не может изменить данные в любой таблице, на которую ссылается запрос, инициировавший триггер.
Это не тот же вопрос, но мой более подробный ответ здесь применим.
Лучшим решением было бы сделать отдельную таблицу для фактического удержания отношений (а не нескольких ссылочных полей в таблице, по-видимому, все чаще называемой "дни рождения"). Эта новая таблица будет выглядеть примерно так:
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....
... хотя братья и сестры и отношения с тетей-племянницей могли быть рассчитаны с помощью объединений.