我想将更改保存到我的远程表中,以便与Android应用程序同步.
包含数据的表定义为:
CREATE TABLE `lh_psalm_join` (
`groupFK` int(11) NOT NULL,
`readingFK` int(11) NOT NULL,
`theOrder` int(11) NOT NULL,
`themeFK` int(11) DEFAULT NULL,
`epigraphFK` int(11) DEFAULT NULL,
`thePart` int(11) DEFAULT NULL,
PRIMARY KEY (`groupFK`,`readingFK`),
KEY `readingFK` (`readingFK`),
KEY `epigraphFK` (`epigraphFK`),
KEY `themeFK` (`themeFK`),
CONSTRAINT `lh_psalm_join_ibfk_1` FOREIGN KEY (`groupFK`) REFERENCES `lh_psalmody_join` (`groupID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `lh_psalm_join_ibfk_2` FOREIGN KEY (`readingFK`) REFERENCES `lh_psalm` (`psalmID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `lh_psalm_join_ibfk_3` FOREIGN KEY (`epigraphFK`) REFERENCES `lh_epigraph` (`epigraphID`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `lh_psalm_join_ibfk_4` FOREIGN KEY (`themeFK`) REFERENCES `lh_theme` (`themeID`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
这是一个关于sincronization的表格:
CREATE TABLE `sync_lh_psalm_join` (
`groupFK` int(11) NOT NULL,
`readingFK` int(11) NOT NULL,
`crud` char(1) DEFAULT NULL,
`lastUpdate` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`groupFK`,`readingFK`),
CONSTRAINT `sync_lh_psalm_join_ibfk_1` FOREIGN KEY (`groupFK`, `readingFK`) REFERENCES `lh_psalm_join` (`groupFK`, `readingFK`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
当在lh_psalm_join
中插入或更新一行时,我希望在sync_lh_psalm_join
中保存一个引用,以便通过判断lastUpdate
字段来执行同步.
为此,我定义了这个触发器:
DROP TRIGGER IF EXISTS `lh_psalm_join_after_update`;
DELIMITER $$
CREATE TRIGGER `lh_psalm_join_after_update` AFTER UPDATE ON `lh_psalm_join` FOR EACH ROW
BEGIN
DECLARE countRows INT(11) DEFAULT 0;
SELECT
COUNT(*)
FROM `sync_lh_psalm_join`
WHERE
`groupFK`=NEW.`groupFK` AND
`readingFK`=NEW.`readingFK`
INTO countRows;
IF countRows>0 THEN
UPDATE `sync_lh_psalm_join` SET
`groupFK`=NEW.`groupFK`,
`readingFK`=NEW.`readingFK`,
`crud`='u',
`lastUpdate`=CURRENT_TIMESTAMP
WHERE
`groupFK`=OLD.`groupFK` AND
`readingFK`=OLD.`readingFK`;
ELSE
INSERT INTO `sync_lh_psalm_join`
(`groupFK`,`readingFK`,`crud`)
VALUES
(NEW.`groupFK`,NEW.`readingFK`,'u');
END IF;
CALL spUpdateSyncStatus('lh_psalm_join');
END$$
DELIMITER ;
由于可能已经存在具有主键的记录,我的 idea 是在更新时将该记录更改为主键的新值,并将lastUpdate
列的值更改为CURRENT_TIMESTAMP
.
但它不起作用,如果我try 主键已经存在于sync_lh_psalm_join
中的某行的lh_psalm_join
中的UPDATE
,它会给我这个错误:
无法删除或更新父行:外键约束失败 (
c39b075_deiverbu
.sync_lh_psalm_join
,约束sync_lh_psalm_join_ibfk_1
FOREIGN KEY(groupFK
,readingFK
) 参考文献lh_psalm_join
(groupFK
,readingFK
))
如果我将WHERE
更改为:
WHERE
`groupFK`=NEW.`groupFK` AND
`readingFK`=NEW.`readingFK`;
我的方法有什么问题吗?