create table 课程信息表
(
课程ID char(6) primary key
check (课程ID IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]','XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9] ')),
课程名称 varchar(40) not null,
课程类别 char(4)  check (课程类别 IN ('基础必修','专业必修','限选','任选')),
学分 real check (  0.5<=学分 AND 学分 <= 5.0),
学时 int   
         check (学分=学时/16 AND 学时%8=0)

)运行结果显示:
服务器: 消息 8141,级别 16,状态 1,行 1
列 CHECK 约束(属于列 '学时')引用了另一列,表 '课程信息表'。
学时那里的约束条件为:“16学时等于一个学分”,请问是什么原因呢?怎么修改?谢谢!

解决方案 »

  1.   

    因为不能 列 CHECK 约束某列时,不能引用了另一列,修改一下如下,是否满足lz的要求use tempdb;create table 课程信息表
    (
    课程ID char(6) primary key
    check (课程ID IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]','XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9] ')),
    课程名称 varchar(40) not null,
    课程类别 char(4) check (课程类别 IN ('基础必修','专业必修','限选','任选')),
    学分 real check ( 0.5<=学分 AND 学分 <= 5.0),
    学时 int
    check (8<=学时 AND 学时<=80 AND 学时%8=0)
    );
      

  2.   


    create table 课程信息表
    (
    课程ID char(6) primary key
    check (课程ID IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]','XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9] ')),
    课程名称 varchar(40) not null,
    课程类别 char(4) check (课程类别 IN ('基础必修','专业必修','限选','任选')),
    学分 real check ( 0.5<=学分 AND 学分 <= 5.0),
    学时 as (学分*16)
    )
      

  3.   


    create table 课程信息表
    (
    课程ID char(6) primary key
    check (课程ID IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]','XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9] ')),
    课程名称 varchar(40) not null,
    课程类别 char(4) check (课程类别 IN ('基础必修','专业必修','限选','任选')),
    学分 real check ( 0.5<=学分 AND 学分 <= 5.0 and 学分%0.5=0),
    学时 as (学分*16)
    )
      

  4.   


    use tempdb;create table 课程信息表
    (
    课程ID char(6) primary key
    check 
    (课程ID 
    IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]',
    'XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9]')),
    课程名称 varchar(40) not null,
    课程类别 char(4) check (课程类别 IN ('基础必修','专业必修','限选','任选')),
    --学分 real check ( 0.5<=学分 AND 学分 <= 5.0),
    学分 as (学时/16),
    学时 int
    check (8<=学时 AND 学时<=80 AND 学时%8=0)
    );
    或是
    use tempdb;create table 课程信息表
    (
    课程ID char(6) primary key
    check 
    (课程ID IN ('JB[0-9][0-9][0-9][0-9]','ZB[0-9][0-9][0-9][0-9]',
    'XX[0-9][0-9][0-9][0-9]','RX[0-9][0-9][0-9][0-9]')),
    课程名称 varchar(40) not null,
    课程类别 char(4) check (课程类别 IN ('基础必修','专业必修','限选','任选')),
    学分 real check ( 0.5<=学分 AND 学分 <= 5.0),
    学时 as (学分*16)
    );
      

  5.   


    因为你用的是 as  , 不是check约束哇以下转自帮助手册:
    AS 子句可用来更改结果集列的名称或为派生列分配名称。通过限制列可接受的值,CHECK 约束可以强制域的完整性。此类约束类似于 FOREIGN KEY 约束,因为可以控制放入列中的值。但是,它们在确定有效值的方式上有所不同:FOREIGN KEY 约束从其他表获得有效值列表,而 CHECK 约束通过不基于其他列中的数据的逻辑表达式确定有效值。