当前位置:  开发笔记 > 编程语言 > 正文

如何在SQL Server中创建外键?

如何解决《如何在SQLServer中创建外键?》经验,为你挑选了7个好方法。

我从来没有为SQL Server"手动编码"对象创建代码,并且外键修改在SQL Server和Postgres之间看似不同.这是我的sql到目前为止:

drop table exams;
drop table question_bank;
drop table anwser_bank;

create table exams
(
    exam_id uniqueidentifier primary key,
    exam_name varchar(50),
);
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
    anwser_id           uniqueidentifier primary key,
    anwser_question_id  uniqueidentifier,
    anwser_text         varchar(1024),
    anwser_is_correct   bit
);

当我运行查询时,我收到此错误:

消息8139,级别16,状态0,行9外键中的引用列数与引用列的数量不同,表'question_bank'.

你能发现错误吗?



1> AlexCuse..:

如果您只想自己创建约束,可以使用ALTER TABLE

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)

我不推荐Sara Chipps提到的内联创建语法,因为我宁愿命名自己的约束.


我知道这已经死了......但我从谷歌搜索到这里,其他许多人都可以.只是一个快速修复:正确的引用方式是:REFERENCES MyOtherTable(MyOtherIDColumn)
**MyTable_MyColumn_FK**是最好的命名实践.

2> John Boker..:
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);


命名外键约束也很有帮助.这有助于解决fk违规问题.例如:"外键fk_questionbank_exams(question_exam_id)引用考试(exam_id)"
我同意命名约束是一个很好的计划但是,至少在SQL Server 2008 R2中,最后一行的语法必须是"约束fk_questionbank_exams外键(question_exam_id)引用考试(exam_id)"
需要注意的一点是创建外键确实_not_创建索引.将另一个表连接到此表可能会导致查询速度极慢.

3> Sara Chipps..:

您还可以使用以下命令命名外键约束:

CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)



4> Shavais..:

我喜欢AlexCuse的答案,但是每当你添加外键约束时你应该注意的是你希望如何处理引用表的行中引用列的更新,特别是你想要如何删除引用中的行待治疗的桌子.

如果创建约束,则:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)

.. 如果引用表中有相应的行,那么引用表中的更新或删除将会出错.

这可能是你想要的行为,但根据我的经验,更常见的不是.

如果您改为创建它:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)
on update cascade 
on delete cascade

..然后,父表中的更新和删除将导致更新和删除引用表中相应行.

(我并不是说应该更改默认值,默认值是谨慎的,这很好.我只是说这是一个创建constaints的人应该始终注意的事情.)

顺便说一句,创建表时可以这样做,如下所示:

create table ProductCategories (
  Id           int identity primary key,
  ProductId    int references Products(Id)
               on update cascade on delete cascade
  CategoryId   int references Categories(Id) 
               on update cascade on delete cascade
)



5> Bijimon..:
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null constraint fk_exam_id foreign key references exams(exam_id),
    question_text varchar(1024) not null,
    question_point_value decimal
);

- 那也行.Pehaps有点更直观的构造?



6> 小智..:

在任何表上创建外键

ALTER TABLE [SCHEMA].[TABLENAME] ADD FOREIGN KEY (COLUMNNAME) REFERENCES [TABLENAME](COLUMNNAME)
EXAMPLE
ALTER TABLE [dbo].[UserMaster] ADD FOREIGN KEY (City_Id) REFERENCES [dbo].[CityMaster](City_Id)



7> 小智..:

如果要使用查询在关系中创建两个表的列,请尝试以下操作:

Alter table Foreign_Key_Table_name add constraint 
Foreign_Key_Table_name_Columnname_FK
Foreign Key (Column_name) references 
Another_Table_name(Another_Table_Column_name)

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有