在sql中,将不同的数据类型指定给外键而不是它所引用的主键是语法错误吗?

iqih9akk  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(681)

我和我的教授就这个问题发生了争执,请给我你的意见。
最初的问题是:
这个脚本有语法错误吗?

CREATE TABLE Dozent
   ( DozNr INTEGER PRIMARY KEY,
      Name VARCHAR(30));

CREATE TABLE Prüfung
   ( DozentNr CHAR(3), StudentNr CHAR(6),
     PRIMARY KEY (DozentNr, StudentNr),
     FOREIGN KEY (DozentNr) REFERENCES Dozent(DozNr),
     FOREIGN KEY (StudentNr) REFERENCES Student(MatrNr) );

所以很明显这是一个错误,因为外键dozentrn被声明为char,而它引用的主键是integer数据类型。我的第一个想法是,指定错误的数据类型是语义错误。我的教授说这是一个语法错误(当然没有任何解释)。
一些研究给了我这些定义:
语法规则指定了语言元素如何排序以形成有效语句。因此,语法检查验证关键字、对象名、运算符、分隔符等是否正确放置在sql语句中。
语义规则指定了如何生成有效的外部引用。因此,语义检查验证对数据库对象和主机变量的引用是否有效,以及主机变量数据类型是否正确。
来源:oracle9i数据库在线文档
当我把这个发给教授时,她只是说:“使用错误的数据类型是语法错误。已定义引用,但数据类型不匹配。“
这对我来说很难解释,但在问了她两次之后,我不想再问她同样的问题了。如果你知道答案,请解释。

5ssjco0h

5ssjco0h1#

我真的不同意你们两个的观点——尽管我认为区别并不重要。
我猜你的教授把错误分为几类,比如:
语法错误
执行错误
安全访问错误
“语义错误”不在清单上。在这个上下文中使用“syntax error”实际上可能意味着“编译阶段的错误”,而不是“执行阶段的错误”。
“语义学”指的是意义,所以我会想到 on s.student_id = h.hospital_id 作为一个语义错误,因为尽管这两个id是整数(例如;),它们不太适合作为 join 条件。
我不确定这个错误是否有意义。这是一个类型不兼容错误。为什么不把这个错误称为外键定义错误呢?还是编译时错误?

相关问题