解决外键约束错误的最佳方法是什么

时间:2018-02-13 16:26:17

标签: mysql synchronization foreign-keys mariadb relationship

我有两个与外键相关的表。

表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。

我想知道是否有更好的解决方案,例如使用触发器或其他机制,不会降低性能。

1 个答案:

答案 0 :(得分:0)

为什么客户端控制同步?这听起来像是一个长期问题。

我建议客户端将数据/已更改的表加载到 staging 表中。然后,当所有需要的数据可用时,您可以执行相应的更新

另一种方法是从此版本的数据库中删除外键约束。它似乎没有必要,并且正在阻碍它。

您也可以使用触发器处理此问题。您在事务中运行的代码可以由触发器中的数据库拥有。但是,触发beget触发器。当您真正决定在第二个表中插入非NULL值的行时,您将需要类似的逻辑。