Sql 无法从单个主键表生成多个外键
这就是我试图做的,但是sql不允许我这么做。如果这不可能,请向我建议替代方案Sql 无法从单个主键表生成多个外键,sql,sql-server,Sql,Sql Server,这就是我试图做的,但是sql不允许我这么做。如果这不可能,请向我建议替代方案 你想要的肯定能实现。考虑下面的表定义: create table Tbl_Course( CrsId int primary key, CrsName varchar(100) ); create table Tbl_Student( StdId int primary key, StdCourse1 int, StdCourse2 int, StdCourse3 i
你想要的肯定能实现。考虑下面的表定义:
create table Tbl_Course(
CrsId int primary key,
CrsName varchar(100)
);
create table Tbl_Student(
StdId int primary key,
StdCourse1 int,
StdCourse2 int,
StdCourse3 int,
foreign key (StdCourse1) references Tbl_Course(CrsId),
foreign key (StdCourse2) references Tbl_Course(CrsId),
foreign key (StdCourse3) references Tbl_Course(CrsId)
);
通过此设置,您可以插入示例数据:
insert into Tbl_Course values
(1001, 'MATHS'),
(1002, 'PHYSICS'),
(1003, 'CHEMISTRY'),
(1004, 'ARTS');
insert into Tbl_Student values
(1, 1001, 1002, 1003),
(2, 1002, 1003, 1004),
(3, 1004, null, null);
如果尝试在子表中插入父表中不存在的值,则会出现错误:
insert into Tbl_Student values(4, 1005, null, null);
INSERT语句与外键约束FK__Tbl_Stude__StdCo__38996AB5冲突
然而,应该注意的是,表Tbl_Student的设计没有规范化。如果一个学生参加3门以上的课程怎么办?您需要向表中添加更多列。如何检查用户是否参加给定的课程?您需要签入3个不同的列。有关遵循标准规范化规则的替代设计,请参见以下Dai的答案。。不要使用列表示多个关系,而是使用行
此外,匈牙利符号也不受欢迎。避免使用对象标识符前缀,如Tbl\ux。而且在列名中不需要使用缩写。在可能的情况下,始终使用完整的拼写,以便其他人能够理解您的系统或自文档代码
考虑这样的设计:
CREATE TABLE Students (
StudentId int NOT NULL PRIMARY KEY IDENTIY(1,1),
-- etc
)
CREATE TABLE Courses (
CourseId int NOT NULL PRIMARY KEY IDENTIY(1,1),
Name nvarchar(100) NOT NULL,
-- etc
)
CREATE TABLE StudentsInCourses (
StudentId int NOT NULL PRIMARY KEY, -- Composite primary key
CourseId int NOT NULL PRIMARY KEY,
CONSTRAINT FOREIGN KEY ( StudentId ) REFERENCES Students ( StudentId ),
CONSTRAINT FOREIGN KEY ( CourseId ) REFERENCES Courses ( CourseId )
)
此设计允许学生参加零个或多个课程,没有上限,并允许使用联接直接查询“课程中的学生”关系,而如果学生想参加3个以上的课程,或者如果您想运行一个涉及学生参加的课程(可能是课程1中的任何一个)的查询,则您的设计不起作用,课程2或课程3在您的设计中
另外,,由于两列都参与了学生课程中的复合主键,因此设计使得学生不可能多次参加同一课程。如果不希望这样做,请使用更具体的要求更新您的问题帖子您尝试过SQL不允许您做的事情是什么?请不要编写所有大写字母的标题。另外,请包括您尝试过的查询。1。向我们展示您尝试的代码2。哪些列有索引可能只是发布代码来创建表和索引,3。在你发布的代码中,你遇到了什么挑战如果一个学生想修3门以上的课程,你的设计就行不通了。它还允许学生在同一课程中学习3次。这是可取的还是正确的?戴:我同意,我在回答中也提到了这一点。我的回答是为了回答OP最初提出的关于创建引用同一表/列的多个foreing键的问题。@GMB我无法以图形方式完成此操作