如何在SQL Server中创建外键?
如何在SQL Server中创建外键?
我从未手动编写过用于SQL Server的对象创建代码,并且在SQL Server和Postgres之间,外键声明似乎有所不同。以下是我目前的SQL代码:
删除表exams; 删除表question_bank; 删除表anwser_bank; 创建表exams ( exam_id uniqueidentifier 主键, exam_name varchar(50), ); 创建表question_bank ( question_id uniqueidentifier 主键, question_exam_id uniqueidentifier 非空, question_text varchar(1024) 非空, question_point_value decimal, 约束 question_exam_id 外键 参考 exams(exam_id) ); 创建表anwser_bank ( anwser_id uniqueidentifier 主键, anwser_question_id uniqueidentifier, anwser_text varchar(1024), anwser_is_correct bit );
当我运行查询时,出现以下错误:
错误消息 8139,级别 16,状态 0,行 9
外键中引用列的数量与被引用表'question_bank'的列数量不同。
你能找出错误吗?
在SQL Server中创建外键的原因是为了实现表之间的关联和引用关系。通过创建外键,可以确保在一个表中的某个列的值必须在另一个表的列中存在,从而保持数据的一致性和完整性。
解决方法是在创建表时使用foreign key
关键字来指定外键约束。在上面的例子中,通过constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
语句,创建了一个名为fk_questionbank_exams
的外键约束,它将question_exam_id
列与exams
表的exam_id
列进行关联。
此外,为了方便故障排除,给外键约束命名也是一个好主意。例如,在上面的例子中,通过在外键约束后面添加注释"foreign key fk_questionbank_exams ( question_exam_id ) references exams (exam_id)"
,可以更容易地定位和解决外键违规的问题。
需要注意的是,创建外键并不会自动创建索引。如果需要在该表中与其他表进行连接操作,可能会导致查询非常慢。因此,在设计数据库时,需要根据实际情况考虑是否需要为外键列创建索引,以提高查询性能。
另外,关于主键是否需要显式指定非空约束的问题,根据不同的数据库实现可能会有所不同。在上述例子中,可以通过将not null
关键字添加到question_id
列的定义中来显式指定非空约束。但是,具体是否需要显式指定非空约束可以根据数据库的要求和设计规范来确定。
在SQL Server中创建外键的原因是为了在表之间建立关联性,并确保数据的完整性和一致性。通过使用外键,可以将一个表中的列与另一个表中的主键进行关联。
要在SQL Server中创建外键,可以使用ALTER TABLE语句并指定FOREIGN KEY约束。以下是一个示例:
alter table MyTable add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)
建议不要使用内联创建外键的语法,因为这样可以更好地命名自己的约束。
要正确引用外键,应该使用REFERENCES关键字,并指定关联表的主键列。例如:
REFERENCES MyOtherTable(MyOtherIDColumn)
在创建外键约束时,最好遵循一些命名规范,例如将外键约束命名为"MyTable_MyColumn_FK"。
总结起来,要在SQL Server中创建外键,可以使用ALTER TABLE语句并指定FOREIGN KEY约束。通过正确引用关联表的主键列,可以确保外键的正确性。为了更好地管理和识别外键约束,建议遵循一些命名规范。