【问题标题】:Does defining foreign keys and table relationships have any effect on writing queries?定义外键和表关系对编写查询有影响吗?
【发布时间】:2011-02-18 01:19:44
【问题描述】:

我在 Mysql 工作台中整理了一个表并定义了多对一关系以及哪些键是外键等,我知道它把它放在了实际的 Create 脚本中。所以我想知道,这只是为了确保数据模型从幕后的角度来看是合乎逻辑的,还是这些关系实际上可以在查询中使用?如果可以,哪些操作会涉及到他们? (简短的示例代码会很棒)

我现在正在 sqlitemanager firefox 插件中构建一个 SQLite 数据库。它没有定义这些东西的选项,我想知道我是否应该关心。 (到目前为止,我只进行了非常简单的查询)。

【问题讨论】:

    标签: sql mysql sqlite foreign-key-relationship


    【解决方案1】:

    实际上,您可以在具有任意列的两个表之间创建连接。拥有主键和外键的全部原因是强制执行两个表之间的关系。换句话说,为了让您在子表中添加一行,您需要将父表的主键用作子表中的外键。否则插入会失败。

    使用外键的另一个原因是允许您的父表执行级联删除。这样,您不必先手动从子表中删除行,然后从父表中删除....如果您正确设置了级联删除,您只需删除表行,所有子行都会也走了。

    也就是说,如果您不想将该特定列显式定义为外键,您仍然可以毫无问题地执行查询,但这会使您的同事难以阅读 ER 图,因为 2 个表之间的关系没有明确定义。

    【讨论】:

    • 所以带有连接的选择查询不会受到影响,但是更新/插入或删除可以使用 fk 关系来保持一致性?我完全赞成在概念上使用外键,但想知道在 Create 代码中专门定义它们的好处。 (我正在计划定义它们,并想知道是否还有其他查询可能性)
    • 只是一些补充,使用外键不仅可以确保数据的完整性,它还会添加隐式索引,如果您不定义这些关系并在查询中使用它们,您应该在您自己的以获得更快的查询。
    • @Damon:看看这篇文章:mssqltips.com/tip.asp?tip=1296。虽然,它指的是 SQL Server,但这个想法是存在的。我的看法是,如果您此时要创建表,最好以正确的方式进行。有时,当项目数据库很小时,设置所有这些规则似乎违反直觉,但是当项目在几年内增长时,您会开始怀疑为什么一开始没有设置它们。它将为您节省大量的头痛和将来的粗心错误。
    【解决方案2】:

    外键非常有用。假设您有一个国家和城市的应用程序。

    Country
    id
    name
    
    City
    id
    name
    countryId
    

    每个城市都有一个外键,表示该城市所在的国家/地区。因为您已将 'cities' 表中的 'countryId' 定义为指向 'country' 表中的 'id' 列的外键当你删除一个国家时,你可以让 MySQL 自动删除所有对应的城市。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2011-12-30
      • 2019-01-27
      • 2011-12-06
      • 2015-08-01
      相关资源
      最近更新 更多