SQL中引用列时使用()与.语法的区别是什么?
外键引用语法中
.与()的差异说明 报错原因
你最初编写的REFERENCES directors.id写法不符合SQL外键定义的语法规则:SQL解析器会将.作为层级分隔符,.前的内容会被识别为 schema(模式)名,.后为表名。因此你写films.id时,PostgreSQL会误判为你要访问名为films的schema下的id表,自然会抛出schema "films" does not exist的错误。
注:你的第一版代码同时存在两处语法疏漏:
directors_id int REFERENCES directors.id行末尾缺少逗号,最后一个字段定义后多了多余的逗号。
两种符号的语法作用差异
两种符号属于完全不同的语法结构,不存在可替代关系:
.是SQL中的标识符层级分隔符,通用规则为[库名].[模式名].[表名].[列名],仅用于区分不同层级的数据库对象,不能用于外键定义中指定目标表的关联列。如果要完整指定关联列,正确的层级写法应该是REFERENCES public.directors(id),而非directors.id。()是外键声明的标准语法组成部分,外键定义的固定结构为REFERENCES 目标表名 (目标表关联字段),括号内明确指定要关联的目标表字段。如果目标表的主键为单列,括号部分可以省略,直接写REFERENCES directors即可生效,显式写全括号内容可以提升代码可读性,避免歧义。
通用SQL语法规则
所有兼容标准SQL的数据库(PostgreSQL、MySQL、SQL Server等)都遵循外键定义的上述规则,二者用途完全独立,不能混用。
内容的提问来源于stack exchange,提问作者user8897159
相关产品推荐
相关产品推荐

