ALBUM
MySQLで< ALBUM_PHOTO
-->PHOTO
データベースモデルを作成しようとしています。
そしてもちろん、これらの3つのテーブルを同期的に更新したいのですが、に挿入するときのように、対応する値ALBUM_PHOTO
に挿入します。しかし、トリガーを追加すると、それらの順序が混乱し、最終的に次のようなこのメソッドを取得しました。ALBUM
PHOTO
-- --------------------------------------------------------
--
-- TABLE `user_album`
--
CREATE TABLE IF NOT EXISTS `user_album` (
`album_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`album_name` varchar(45) NOT NULL,
`cover_id` int(11) NOT NULL,
`numbers_of_photo` int(11) NOT NULL,
`album_desc` varchar(45) DEFAULT NULL,
`album_path` varchar(45) DEFAULT NULL,
`addtime` datetime NOT NULL,
PRIMARY KEY (`album_id`,`user_id`),
KEY `fk_album_user_id_idx` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- TRIGGER `user_album`
--
DROP TRIGGER IF EXISTS `tg_album_insert`;
DELIMITER //
CREATE TRIGGER `tg_album_insert` AFTER INSERT ON `user_album`
FOR EACH ROW BEGIN
UPDATE USER_ALBUM SET NUMBERS_OF_PHOTO = 0
WHERE ALBUM_ID = NEW.ALBUM_ID;
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS `tg_album_update_then_delete`;
DELIMITER //
CREATE TRIGGER `tg_album_update_then_delete` AFTER UPDATE ON `user_album`
FOR EACH ROW BEGIN
DELETE FROM USER_ALBUM
WHERE ALBUM_ID = NEW.ALBUM_ID AND NEW.NUMBERS_OF_PHOTO <= 0;
END
//
DELIMITER ;
-- --------------------------------------------------------
--
-- TABLE `user_photo`
--
CREATE TABLE IF NOT EXISTS `user_photo` (
`photo_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`thumbnail_id` int(11) NOT NULL,
`photo_name` varchar(45) DEFAULT NULL,
`addtime` datetime NOT NULL,
`photo_path` varchar(45) NOT NULL,
PRIMARY KEY (`photo_id`),
KEY `fk_photo_user_id_idx` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- TABLE `user_album_photo`
--
CREATE TABLE IF NOT EXISTS `user_album_photo` (
`photo_id` int(11) NOT NULL AUTO_INCREMENT,
`album_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`photo_name` varchar(45) DEFAULT NULL,
`desc` varchar(45) DEFAULT NULL,
`tag` varchar(45) DEFAULT NULL,
PRIMARY KEY (`photo_id`),
KEY `fk_album_photo_photo_id_idx` (`photo_id`),
KEY `fk_album_photo_album_id_idx` (`album_id`),
KEY `fk_album_photo_user_id_idx` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
--
-- TRIGGER `user_album_photo`
--
DROP TRIGGER IF EXISTS `tg_album_photo_delete`;
DELIMITER //
CREATE TRIGGER `tg_album_photo_delete` AFTER DELETE ON `user_album_photo`
FOR EACH ROW BEGIN
DELETE FROM USER_PHOTO WHERE PHOTO_ID = OLD.PHOTO_ID;
UPDATE USER_ALBUM SET NUMBERS_OF_PHOTO = NUMBERS_OF_PHOTO-1
WHERE ALBUM_ID=OLD.ALBUM_ID;
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS `tg_album_photo_insert`;
DELIMITER //
CREATE TRIGGER `tg_album_photo_insert` AFTER INSERT ON `user_album_photo`
FOR EACH ROW BEGIN
IF NOT EXISTS (SELECT * FROM `user_album` WHERE ALBUM_ID = NEW.ALBUM_ID) THEN
INSERT INTO USER_ALBUM VALUES(NEW.ALBUM_ID, UEW.USER_ID);
ELSE
UPDATE USER_ALBUM SET NUMBERS_OF_PHOTO=NUMBERS_OF_PHOTO+1
WHERE ALBUM_ID = NEW.ALBUM_ID;
END IF;
INSERT INTO USER_PHOTO VALUES(NEW.PHOTO_ID, NEW.USER_ID);
END
//
DELIMITER ;
しかし、ここで問題は、TABLEに外部キー制約を追加したことですが、レコードを挿入するときに、他の2つのテーブルに対応するレコードがない場合にUSER_ALBUM_PHOTO
最初に挿入されます。USER_ALBUM_PHOTO
USER_ALBUM_PHOTO
したがって、おそらくPHOTO
>- ALBUM_PHOTO
<-のように、他の2つのテーブルに制約を追加する必要がありALBUM
ますか?
またはsthが必要です。私のトリガーが間違っています。
どうも!