最近在做数据库试验,遇到一个问题。我大体描述一下情况。【工具是sql server 2000】
我现在有四张表 :
 
学生信息表 (学号,姓名……)成绩表 (学号,课程号,成绩)奖励表单(奖励号,奖励名称)奖励情况表(学号,奖励号,时间)课程表(课程号,课程名称,课时,学分)以上,四个表里,顺着来,主键依次是
(学号)
(学号,课程号)
(奖励号)
(学号,奖励号)可以看出来各个外键分别是学号,奖励号,课程号
这只是我所有表里的一部分
进行E-R图分析时,“课程表”和“学生信息表”的card(E,R)=(N,N),所以,我就就着他们的关系生成新表“成绩表”我们学习的时候说如果两方的联系是一对多时,在多方把一方的主键放进去做外键
多对多则要单独生成一张表,里面分别有两方的主键在里面,同时他们是外键
我先创建了没有外键约束的“成绩表”和“奖励表单”接下来才同时创建其他三张表,可是还是出现了“'外键7' 的引用列的列表中列数目与被引用表 '奖励情况表' 中主键的列数
目不匹配
”【这句话针对我的这个句子 —> CONSTRAINT 外键7 FOREIGN KEY (奖励号) REFERENCES 奖励情况表 ON 
DELETE CASCADE】,这个我知道是因为我的“奖励情况表”里的主键是(学号,奖励号),而我这里只关联了里面的奖励号的原因。可是我不知道专业术语里这是怎么一个情况,我们遇到时该怎么处理最好呢? 
所以,这里的外键设置我该怎么写句子?才能解决这个问题。

解决方案 »

  1.   

    看来楼主不太会提问题。最好贴出部分数据,以及有问题的语句和期望结果。
    --CSDN的朋友不是谁都可以正确理解楼主陈述的问题。
      

  2.   

    嗯,好的不过,我的问题被我捣鼓出来了,这些脚本也能运行正常了,只是我还有一点点问题要问,下面是我创建的所有表。
    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
    这样子用是正确的?请帮我回答一下,我一直很郁闷这个问题,谢谢,^^