Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法从单个主键表生成多个外键_Sql_Sql Server - Fatal编程技术网

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

这就是我试图做的,但是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 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我无法以图形方式完成此操作