0

ALBUMMySQLで< ALBUM_PHOTO-->PHOTOデータベースモデルを作成しようとしています。

そしてもちろん、これらの3つのテーブルを同期的に更新したいのですが、に挿入するときのように、対応する値ALBUM_PHOTOに挿入します。しかし、トリガーを追加すると、それらの順序が混乱し、最終的に次のようなこのメソッドを取得しました。ALBUMPHOTO

-- --------------------------------------------------------

--
-- 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が必要です。私のトリガーが間違っています。

どうも!

4

0 に答える 0