代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

避免常见sql开发错误的策略(join bug的误导性结果)

sql
  •  0
  • Paul Sasik  · 技术社区  · 15 年前

    有时,当我编写带有几个联接的中等复杂的SELECT语句时,有时会在JOIN语句中使用错误的键列,这些键列仍然返回有效的结果。

    由于自动编号值(尤其是在开发早期)都倾向于落在类似的范围内(小于100秒左右),因此“选择窗台”会产生一些结果。这些结果乍一看通常是有效的,直到很久以后才发现问题,这使得调试更加困难,因为对数据结构和代码的熟悉已经过时了(在开发人员的头脑中变得陈腐。)

    我只是花了几个小时来追踪这个问题的另一个方面,我以前遇到过很多次。我仔细命名我的表和列,有条不紊地编写SQL语句,但这是一个我似乎无法完全避免的问题。它卷土重来,平均一年两次,让我工作了好几个小时。

    我曾想过尝试用不同的起始值自动编号,但这感觉很笨拙,如果试图为具有数十个表的数据模型保持这样一个方案的正确性,会变得很糟糕。。。还有更好的主意吗?

    我在命名我的表和列时非常谨慎和有条理。Patient table获取PatientId列,Facility获取FacilityId等。当涉及连接表时,此问题往往会出现,其中链接具有额外的含义,例如:RelatedPatientId、ReferringPatientID、FavoriteItemId等。

    7 回复  |  直到 15 年前
        1
  •  2
  •   JonH    15 年前

    在编写长而复杂的SELECT语句时,尝试将结果限制为一条记录。 例如,假设你有一个巨大的令人敬畏的CMS系统,你必须编写内部报告,因为它附带的报告是可怕的。你注意到大约有500张桌子。select语句连接了其中30个表。您的结果应该使用WHERE子句来限制行数。

    我的建议是编写所有这些代码,并将其推广到所有情况,分解问题,使用WHERE,并将行数限制为只说一条记录。检查所有字段,如果它们看起来正常,将其拆分,让代码返回更多行。只有在进一步检查之后,你才能概括。

        2
  •  2
  •   gbn    15 年前

    一种选择是使用自然关键点。

    实际上,redgatesql提示符为我选择FK列。

    我也倾向于一次建立一个连接,看看事情是怎样的。

        3
  •  1
  •   Robert Harvey    15 年前

        4
  •  1
  •   JeffO    15 年前

    您的列名应该注意这一点,除非您将它们全部命名为“ID”。是否使用相同的表编写多个select语句?您可能希望为更常见的视图创建视图。

        5
  •  1
  •   Tamas Czinege    15 年前

    如果您使用的是SQL Server,则可以使用GUID列作为主键(我们就是这样做的)。你不会再有碰撞问题了。

        6
  •  1
  •   Cœur N0mi    6 年前

    您可以使用guid作为主键,但它有自己的特性 pros and cons

    实际上,该页上没有提到此专业版。

    我自己从来没有尝试过这样做——我在SQL上使用了一个工具,使得不正确的连接非常不可能,所以我没有这个问题。我只是想把它作为另一种选择提出来!

        7
  •  0
  •   Damir Sudarevic    15 年前
    1. 对于ID,请使用TableNameID,例如,对于table Person ,使用 PersonID

    ... ON p.PersonID = d.PersonID
    

    与之相反:

    ... ON p.ID = d.ID