1

这是我创建的表之一:

create table take
   (SID integer references student(SID),
    CID integer references course(CID),
    FID integer references faculty(FID),
    semester varchar(10) primary key constraint chk check(semester in('Fall','spring')),
    year_a integer ,
    grade integer)

插入值时:

insert into take 
values(105,2,1001,'spring',2009,9)

我收到以下错误

消息 2627,级别 14,状态 1,第 1 行
违反主键约束“PK_ take _0184BAF3D4160567”。无法在对象“dbo.take”中插入重复键。重复键值为 (fall)。

请帮忙

4

1 回答 1

1

好吧,您已经定义semester为只能存储两个值之一 - fallor spring,并且您已将其设为主键(唯一标识每一行的键)。

因此,一旦您使用 存储了一行,使用 存储fall了第二行spring,您的约束将禁止任何进一步的插入。

非常怀疑您是否只想semester使用两个可能的值作为主键...

我相信你可能打算做的是:

  • 限制semesterfallspring
  • 在上创建一个主键,(semester, year)以便您可以拥有fall 2013,spring 2014fall 2014

在这种情况下,您需要将创建脚本更改为:

CREATE TABLE dbo.Take
   (SID INT REFERENCES student(SID),
    CID INT REFERENCES course(CID),
    FID INT REFERENCES faculty(FID),
    Semester VARCHAR(10) 
        CONSTRAINT CHK_Semester CHECK(Semester IN ('Fall','spring')),
    Year_a INT,
    grade INT,

    CONSTRAINT PK_Take PRIMARY KEY CLUSTERED(Semester, Year_a)
)
于 2013-10-17T05:04:02.263 回答