SQL Server添加约束

时间:2014-11-15 12:44:06

标签: sql-server constraints

我有以下两个表

Create table Exam
(
    coursecode nvarchar(6) Not Null Constraint Pk_courseCode Primary Key (coursecode),
    [examiner-name] [varchar](25) ,
    [date] date not null,
    slot varchar(2),

)

Alter table Exam with check 
  add constraint [coursecode_ck_validity] check ((coursecode like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'))

Alter table Exam with check 
  add constraint [date_ck_validity] check  (Month([date]) = 5 or Month([date]) = 11)

Alter table Exam with check 
  add constraint [slot_ck_validity] check (slot in ('AM', 'PM'))

此表Student

Create table Student
(
    [script-id] int identity(1,1) not null Constraint [PK_Student] Primary key ([script-id]),
    [student-id] char(8) not null,
    [course-code] nvarchar(6) Not Null constraint [FK_Student] foreign key([course-code]) references Exam ([course-code]),
    [seat-no] int not null constraint [seatno_ck_validity] check ([seat-no] between 1 and 3000 )

)

除了上述陈述之外,我还有其他约束,我必须应用,但不知道如何应用这些约束

约束

  • 不允许删除课程代码,并且级联课程代码更新。

  • 考试与学生之间的最低基数为M:O。

由于

1 个答案:

答案 0 :(得分:1)

  

不允许删除课程代码,并且级联课程代码更新

您的意思是不允许删除Exam 吗?如果是这样,请不要grantdeny(或主动DeleteExam

  

更新课程代码是级联的

使用Cascading Referential Integrity Constraints

Create table Student
(
    -- ...
    [course-code] nvarchar(6) Not Null 
        Constraint [FK_Student] foreign key([course-code]) 
        References Exam ([course-code]) /***/ On Update Cascade /***/
    -- ...
)

......和你的第二个条件......

  

考试与学生之间的最低基数为M:O。

我不确定您在这种情况下试图解决的问题。您Not Null上的Foreign KeyStudent.course-code约束应该是所有需要的。

顺便说一句,请确保一致的命名约定;具体而言,比较Exam.coursecodeStudent.course-code。此外,在专业SQL世界中,下划线比对象名中的连字符更为普遍。