MySQL, как обновить внешний ключ автоматически - PullRequest
0 голосов
/ 06 октября 2011

это мои столы

 CREATE TABLE IF NOT EXISTS `carslibrary` (
      `CarID` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `CarName` varchar(255) NOT NULL,
      PRIMARY KEY (`CarID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

    CREATE TABLE IF NOT EXISTS `colorslibrary` (
      `ColorID` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `ColorName` varchar(255) NOT NULL,
      PRIMARY KEY (`ColorID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


    CREATE TABLE IF NOT EXISTS `facerecord` (
      `carslibrary_ID` int(10) unsigned NOT NULL,
      `colorslibrary_ID` int(11) unsigned NOT NULL,
      KEY `carslibrary_ID` (`carslibrary_ID`),
      KEY `colorslibrary_ID` (`colorslibrary_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

я заметил, что атрибут carslibrary_ID внутри таблицы facerecord не обновляется автоматически, когда я добавляю запись автомобиля в таблицу carslibrary, что мне делать, чтобы иметь возможность?

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Во-первых, вам нужно будет указать значение по умолчанию для facerecord.colorslibrary_ID, так как вы не будете «знать», что это такое, когда вставляете в таблицу carslibrary.Тем не менее, вы можете изменить свой DDL для таблицы facerecord следующим образом:

CREATE TABLE `facerecord` (
`carslibrary_ID` int(10) unsigned NOT NULL,
`colorslibrary_ID` int(10) unsigned NOT NULL DEFAULT '0',
KEY `carslibrary_ID` (`carslibrary_ID`),
KEY `colorslibrary_ID` (`colorslibrary_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Я также изменил тип данных столбца colorslibrary_ID, чтобы он соответствовал типу данных столбца colorslibrary.ColorID на случай, если выкогда-нибудь хочется установить внешний ключ между facerecord.colorslibrary_ID и colorslibrary.ColorID;).Для полноты вы должны вставить строку в таблицу colorslibrary с ColorID = 0. Следовательно:

insert into `colorslibrary` (ColorName) values ('unknown color');

update `colorslibrary` set ColorID = 0 where ColorName = 'unknown color';

Затем вы можете продолжить и определить свой триггер для вставки в таблицу facerecord:

delimiter $$

CREATE TRIGGER carslibrary_trigger
    AFTER insert ON carslibrary
    FOR EACH ROW
    BEGIN
      insert into facerecord (carslibrary_ID) values (new.CarID);
END$$

delimiter;

Все новые строки, вставленные в таблицу facerecord, будут вставлены с colorslibrary_ID, относящимся к «неизвестному цвету» colorslibrary.ColorName. Затем вы можете вручную обновить facerecord.colorslibrary_IDкак и когда вы это знаете.

Удачи!

PS Если вам нужно удалить любые существующие триггеры AFTER insert из таблицы carslibrary, вы можете сделать это, сначала найдя существующие триггеры:

select trigger_name
from information_schema.triggers
where event_object_table = 'carslibrary'
and action_timing = 'AFTER'
and event_manipulation= 'INSERT';

Затем возьмите имя триггера, возвращенного вышеприведенным оператором (скажем, возвращена строка 'carslibrary_trigger'), и выполните:

drop trigger carslibrary_trigger;

Затем повторно запустите CREATE TRIGGER script.

Как только триггер настроен, он автоматически выполнит действие, которое вы указали, когда произойдет указанное вами действие триггера.В этом случае мы говорим базе данных «после того, как вставка происходит в таблицу carslibrary, автоматически вставьте строку в таблицу facerecord, используя CarID новой строки carslibrary для заполнения столбца facerecord.carslibrary_ID».Как и в большинстве случаев, лучший способ это попробовать!После того, как вы создали триггер, вручную вставьте новую строку в таблицу 'carslibrary table. Now look at the data in the facerecord` - вы должны увидеть новую строку, которая была вставлена ​​при срабатывании триггера.

Похоже, вы выиграете отузнав о триггерах.Я рекомендую документы на сайте MySQL , потому что этот ответ на путь длиннее, чем я предполагал!

0 голосов
/ 06 октября 2011

Вам нужно будет использовать триггеры. Смотри http://dev.mysql.com/doc/refman/5.0/en/triggers.html

...