SQL 外键互斥
SQL foreign key mutex
我不知道如何准确命名这个问题,因为我还在学习SQL。我使用 sqlite3 进行简单测试,我的问题如下:
我有两个带有主键的 table。第一个 table 在插入时自动递增键,第二个引用此键。假设我插入到第一个 table 中,然后我使用之前插入的密钥插入到第二个 table 中。现在我有一个外键约束。这行得通,但假设在我开始插入第二个 table 之前,另一个线程从第一个 table 中删除密钥并插入另一个密钥。这将具有相同的主键整数值(我在 sqlite 文档中读过)。现在数据可能不一致。
这种情况的解决方案是什么?将两个插入物包装在一个事务中有帮助吗?
如果您创建了一个外键,如果第一个 table 中不存在该键,则插入将失败并出现错误。这就是创建 FK 关系的要点:它确保数据保持一致。
类似地,如果您将行插入到两个 table 中,然后尝试从 'parent' table 中删除该行,除非您已设置级联删除,这将删除第二个 'child'、table 中的相关行。无论哪种方式,一致性都得以保留。
将两个插入包装在一个事务中会有所帮助。
将两个线程(事务)彼此隔离是things that transactions are designed for。
之一
我不知道如何准确命名这个问题,因为我还在学习SQL。我使用 sqlite3 进行简单测试,我的问题如下:
我有两个带有主键的 table。第一个 table 在插入时自动递增键,第二个引用此键。假设我插入到第一个 table 中,然后我使用之前插入的密钥插入到第二个 table 中。现在我有一个外键约束。这行得通,但假设在我开始插入第二个 table 之前,另一个线程从第一个 table 中删除密钥并插入另一个密钥。这将具有相同的主键整数值(我在 sqlite 文档中读过)。现在数据可能不一致。
这种情况的解决方案是什么?将两个插入物包装在一个事务中有帮助吗?
如果您创建了一个外键,如果第一个 table 中不存在该键,则插入将失败并出现错误。这就是创建 FK 关系的要点:它确保数据保持一致。
类似地,如果您将行插入到两个 table 中,然后尝试从 'parent' table 中删除该行,除非您已设置级联删除,这将删除第二个 'child'、table 中的相关行。无论哪种方式,一致性都得以保留。
将两个插入包装在一个事务中会有所帮助。
将两个线程(事务)彼此隔离是things that transactions are designed for。
之一