【问题标题】:One to many Foreign Key relation Sqlite一对多外键关系Sqlite
【发布时间】:2015-02-14 03:49:42
【问题描述】:

所以现在我正在尝试使用sqlite 在 3 个不同的表之间绘制关系我对 sqlite 相对较新,但看到您可以通过使用外键绘制关系从而优化性能。所以现在这里是我创建表的 sql 语句:

'CREATE TABLE IF NOT EXISTS shifts (
 shifts_id primary integer,
 shift_base_id integer,
 shift_site_id integer)';

'CREATE TABLE IF NOT EXISTS sites (
 site_id primary integer, 
 site_info text,
 FOREIGN KEY(site_id) REFERENCES shifts(shift_site_id))';

 'CREATE TABLE IF NOT EXISTS bases (
 base_id primary integer, 
 base_info text,
 FOREIGN KEY(base_id) REFERENCES shifts(shift_base_id))';

所以我要做的是通过 id 绘制子表(站点和基地)与父表(班次)之间的关系。我遇到的问题是我收到“外键不匹配”错误。我在某处读到,在 sqlite 中,您只能引用父表中的主键或唯一键。这样做的问题是多个班次可以共享相同的站点和基地。例如 base_id 可以等于 1234,多个班次的 shifts_base_id = 1234。

有时,bases 表中的 base_id 在 shifts 表中不会有匹配的 shift_base_id。

所以我的问题是如何在多个表之间引用这个一对多的关系?以及如何使这种关系成为可选的。

【问题讨论】:

    标签: javascript database sqlite


    【解决方案1】:

    你的关系倒退了。您在表中列出引用其他表的外键。

    CREATE TABLE IF NOT EXISTS shifts (
     shifts_id primary integer,
     shift_base_id integer,
     shift_site_id integer,
     FOREIGN KEY (shift_base_id) REFERENCES bases (base_id),
     FOREIGN KEY (shift_site_id) REFERENCES site (site_id));
    

    【讨论】:

    • 感谢@Barmar 的帮助,这很有意义并解决了我的大部分问题。如果可能的话,另一个是使关系成为可选的。因此,如果 bases 表中不存在 shift_base_id 则不会失败。
    • @JoeKomputer 然后删除外键。 FK 的全部意义在于加强关系;将它们设为“可选”就等于根本没有它们。
    • @ColonelThirtyTwo 我可以删除外键,但我创建这些 FK 关系的原因是在我去查询数据库 WHERE site_id = shift_site_id 时加快 SELECT 查询。那么,如果有一种方法可以让 FK 成为可选项,那么从这个意义上说会是有益的吗?或者,如果有另一种方法可以提高不涉及 FK 的表之间的性能,我愿意接受建议。
    • @JoeKomputer FK 不会提高性能;他们只是在插入或更新列时检查另一个表中是否存在值。
    • @JoeKomputer 索引只是让查找速度更快。 WHERE site_id = shift_site_id 将使用 shift_site_id 的值查找 site_id(因为它是主键,已经有一个索引)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2016-10-04
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多