最近在做数据库试验,遇到一个问题。我大体描述一下情况。【工具是sql server 2000】
我现在有四张表 :
学生信息表 (学号,姓名……)成绩表 (学号,课程号,成绩)奖励表单(奖励号,奖励名称)奖励情况表(学号,奖励号,时间)课程表(课程号,课程名称,课时,学分)以上,四个表里,顺着来,主键依次是
(学号)
(学号,课程号)
(奖励号)
(学号,奖励号)可以看出来各个外键分别是学号,奖励号,课程号
这只是我所有表里的一部分
进行E-R图分析时,“课程表”和“学生信息表”的card(E,R)=(N,N),所以,我就就着他们的关系生成新表“成绩表”我们学习的时候说如果两方的联系是一对多时,在多方把一方的主键放进去做外键
多对多则要单独生成一张表,里面分别有两方的主键在里面,同时他们是外键我先创建了没有外键约束的“成绩表”和“奖励表单”接下来才同时创建其他三张表,可是还是出现了“'外键7' 的引用列的列表中列数目与被引用表 '奖励情况表' 中主键的列数
目不匹配”【这句话针对我的这个句子 —> CONSTRAINT 外键7 FOREIGN KEY (奖励号) REFERENCES 奖励情况表 ON
DELETE CASCADE】,这个我知道是因为我的“奖励情况表”里的主键是(学号,奖励号),而我这里只关联了里面的奖励号的原因。可是我不知道专业术语里这是怎么一个情况,我们遇到时该怎么处理最好呢?
所以,这里的外键设置我该怎么写句子?才能解决这个问题。
我现在有四张表 :
学生信息表 (学号,姓名……)成绩表 (学号,课程号,成绩)奖励表单(奖励号,奖励名称)奖励情况表(学号,奖励号,时间)课程表(课程号,课程名称,课时,学分)以上,四个表里,顺着来,主键依次是
(学号)
(学号,课程号)
(奖励号)
(学号,奖励号)可以看出来各个外键分别是学号,奖励号,课程号
这只是我所有表里的一部分
进行E-R图分析时,“课程表”和“学生信息表”的card(E,R)=(N,N),所以,我就就着他们的关系生成新表“成绩表”我们学习的时候说如果两方的联系是一对多时,在多方把一方的主键放进去做外键
多对多则要单独生成一张表,里面分别有两方的主键在里面,同时他们是外键我先创建了没有外键约束的“成绩表”和“奖励表单”接下来才同时创建其他三张表,可是还是出现了“'外键7' 的引用列的列表中列数目与被引用表 '奖励情况表' 中主键的列数
目不匹配”【这句话针对我的这个句子 —> CONSTRAINT 外键7 FOREIGN KEY (奖励号) REFERENCES 奖励情况表 ON
DELETE CASCADE】,这个我知道是因为我的“奖励情况表”里的主键是(学号,奖励号),而我这里只关联了里面的奖励号的原因。可是我不知道专业术语里这是怎么一个情况,我们遇到时该怎么处理最好呢?
所以,这里的外键设置我该怎么写句子?才能解决这个问题。
--CSDN的朋友不是谁都可以正确理解楼主陈述的问题。
Create DataBase STD_OP_DBs
ON Primary
( Name=STD_OP,
FileName='d:\sql\STD_OP_DBs.mdf',
Size=1MB,
MaxSize=50MB,
FileGrowth=5MB)LOG ON
(Name=STD_OP_DBs_log,
FileName='d:\sql\STD_OP_DBs_log.ldf',
Size=1MB,
MaxSize=5MB,
FileGrowth=10%)use STD_OP_DBs
CREATE TABLE class_table (
班级号 varchar(4) NOT NULL,
班级名称 varchar(20) ,
辅导员 varchar(10) ,
班长 varchar(10) ,
PRIMARY KEY (班级号)
)use STD_OP_DBs
CREATE TABLE std_information (
学号 varchar(11) NOT NULL,
姓名 varchar(10),
性别 varchar(2) ,
出生年月 datetime,
籍贯 varchar(6) ,
班级号 varchar(4) NOT NULL,
PRIMARY KEY (学号),
CONSTRAINT 外键1 FOREIGN KEY (班级号) REFERENCES class_table ON DELETE CASCADE
)use STD_OP_DBs
CREATE TABLE course_table (
课程号 varchar(4) NOT NULL,
课程名 varchar(30) ,
课程类型 varchar(8) ,
课时 int ,
学分 int ,
PRIMARY KEY (课程号)
) use STD_OP_DBs
CREATE TABLE punishment_table (
处分编号 varchar(3) NOT NULL,
处分名称 varchar(10),
PRIMARY KEY (处分编号)
)use STD_OP_DBs
CREATE TABLE rewards_table (
奖励编号 varchar(3) NOT NULL,
奖励名称 varchar(20),
PRIMARY KEY (奖励编号)
)use STD_OP_DBs
CREATE TABLE has_published (
学号 varchar(11) NOT NULL,
处分编号 varchar(3) NOT NULL,
处分时间 datetime ,
PRIMARY KEY (学号,处分编号),
CONSTRAINT 外键2 FOREIGN KEY (学号) REFERENCES std_information ON DELETE CASCADE,
CONSTRAINT 外键3 FOREIGN KEY (处分编号) REFERENCES punishment_table ON DELETE CASCADE
)use STD_OP_DBs
CREATE TABLE has_rewarded (
学号 varchar(11) NOT NULL,
奖励编号 varchar(3) NOT NULL,
奖励时间 datetime ,
PRIMARY KEY (学号,奖励编号),
CONSTRAINT 外键4 FOREIGN KEY (学号) REFERENCES std_information ON DELETE CASCADE,
CONSTRAINT 外键5 FOREIGN KEY (奖励编号) REFERENCES rewards_table ON DELETE CASCADE
)use STD_OP_DBs
CREATE TABLE grade_table (
学号 varchar(11) NOT NULL,
课程号 varchar(4) NOT NULL,
选课时间 datetime ,
成绩 int ,
PRIMARY KEY (学号,课程号),
CONSTRAINT 外键6 FOREIGN KEY (学号) REFERENCES std_information ON DELETE CASCADE,
CONSTRAINT 外键7 FOREIGN KEY (课程号) REFERENCES course_table ON DELETE CASCADE,
CHECK ((成绩 is null) or (成绩 Between 0 AND 100))
)use STD_OP_DBs
CREATE TABLE course_class (
教学班代号 varchar(4) NOT NULL,
课程号 varchar(4) NOT NULL,
授课教师 varchar(10) ,
教室 varchar(10) ,
PRIMARY KEY (教学班代号),
CONSTRAINT 外键8 FOREIGN KEY (课程号) REFERENCES course_table ON DELETE CASCADE
)之前会出现错误是因为我的‘外键1’是放在class_table 里的,‘外键2’是放在std_information里的,‘外键3’是放在punishment_table里的,依此类推……
因此,才出现了类似于上面我所描绘的问题不过虽然现在问题解决了,可是我还有一点点疑问,我这样做是正确的?外键是要这样子用(在引用表里进行约束)吗? ON DELETE CASCADE
这样子用是正确的?请帮我回答一下,我一直很郁闷这个问题,谢谢,^^