没有引用列规范的外键

dis*_*ete 5 foreign-key sql-server referential-integrity

我在SQL Server 文档中注意到引用列的列表不是外键约束的必需参数:

<column_constraint> ::= 
    [ CONSTRAINT constraint_name ] 
    {     { PRIMARY KEY | UNIQUE } 
            (...)

      | [ FOREIGN KEY ] 
            REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
            [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
            [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
            [ NOT FOR REPLICATION ] 

      | CHECK (...)
    }
Run Code Online (Sandbox Code Playgroud)

如果我省略该( ref_column )部分,它似乎引用了referenced_table_name. 这样最方便。但是,我找不到此行为的任何规范,因此我谨慎使用它。

有谁知道它是否在任何地方指定?

Pau*_*ite 7

我熟悉的任何官方 SQL Server 文档中都没有明确提到这种行为,但 1992 年的 SQL 标准草案(第 11.8.2.b 节)确实说:

如果<referenced table and columns>未指定 a <reference column list>,则被引用表的表描述符应包括一个唯一约束,指定PRIMARY KEY。让被引用的列是由该唯一约束中的唯一列标识的一列或多列,并让被引用的列是一个这样的列。本<referenced table and columns>应被视为隐含指定<reference column list>那是相同的<unique column list>

翻译过来,这意味着隐式外键确实引用了被引用表的主键。正如其他人在对该问题的评论中提到的那样,最好明确说明这种关系。