我有两个与外键相关的表。
表A:
CREATE TABLE IF NOT EXISTS `table_a` (
`user_a_id` INTEGER NOT NULL, `remote_a_id` INTEGER NOT NULL,
`user_b_id` INTEGER, `remote_b_id` INTEGER,
PRIMARY KEY(`user_a_id`, `remote_a_id`),
FOREIGN KEY(`user_b_id`, `remote_b_id`) REFERENCES `table_b`(`user_b_id`, `remote_b_id`) ON UPDATE CASCADE ON DELETE RESTRICT
)
表B:
CREATE TABLE IF NOT EXISTS `table_b` (
`user_b_id` INTEGER NOT NULL, `remote_b_id` INTEGER NOT NULL,
`name` TEXT,
PRIMARY KEY(`user_b_id`, `remote_b_id`)
)
虽然客户端在表中正确维护关系,但我不知道哪个表将首先在服务器上进行远程同步。如果客户端首先同步table_b,则没有问题。但是如果客户端同步table_a并且键不在table_b中,则会发生外键限制错误。
目前我在一个事务中解决了这个问题:如果table_b中没有(user_b_id,remote_b_id),我在table_b中插入一条新记录,其中table_b.user_b_id = user_b_id,table_b.remote_b_id = remote_b_id和table_b.name = null之前插入table_a。
我想知道是否有更好的解决方案,例如使用触发器或其他机制,不会降低性能。
答案 0 :(得分:0)
为什么客户端控制同步?这听起来像是一个长期问题。
我建议客户端将数据/已更改的表加载到 staging 表中。然后,当所有需要的数据可用时,您可以执行相应的更新 。
另一种方法是从此版本的数据库中删除外键约束。它似乎没有必要,并且正在阻碍它。
您也可以使用触发器处理此问题。您在事务中运行的代码可以由触发器中的数据库拥有。但是,触发beget触发器。当您真正决定在第二个表中插入非NULL
值的行时,您将需要类似的逻辑。