错误代码
CREATE TABLE 成绩(学号 char(10), 课号 char(30), 成绩 int, PRIMARY KEY (学号, 课号),
REFERENCES 课程 ON DELETE RESTRICT);
修改为:
CREATE TABLE 成绩(学号 char(10), 课号 char(30), 成绩 int, PRIMARY KEY (学号, 课号),
FOREIGN KEY (学号) REFERENCES 学生(学号)on delete cascade,
FOREIGN KEY (课号) REFERENCES 课程(课号) on delete cascade);
LZ所写的语法有点问题,FOREIGN KEY后面多了个逗号,REFERENCES 后面只有表名,没有指定关联表的主键列。 主要问题出在ON DELETE CASCADE这样的级联删除约束子句上面。
上面的语法估计在SQL SERVER上面是没有问题的。但是在ACCESS 2003等环境中就会有“constraint 子句语法错误”的提示。那是因为在不同的SQL环境中,支持的语法标准也是有差异的。
不过,可以在ACCESS中,工具菜单中“选项”中,设置语法兼容性即可。具体见下图:
更进一步分析:
reate table 学生(学号 char(10) ,姓名 char(10), 性别 char(2),primary key (学号));
create table 课程(课号 char(10),课程名 char(10),课时 int,学分 int),primary key (课号));
create table 成绩(学号 char(10),课号 char(10),成绩 int,primary key(学号,课号),foreign key(学号) references 学生 on delete cascade,foreign key(课号) references 课程 on delete restrict);
对成绩这张表的要求是
当 从学生这张表中删除一条记录时,从成绩表中也删除对应学号的记录,
当 从课程这种表中删除一条记录时,如果成绩表中已经有有对应课号的记录,将不能删除。
教程里面给的语句的例子就是上面的三条,可是我在SQL2000里输入相同的语句却出现错误,
前两条语句都可以通过
第三条提示错误 “在关键字 'restrict' 附近有语法错误。”
我不知道为什么会出现个错误,是restrict语法不对吗?在SQL2000的联机丛书中也没有找到
还有正确的语句应该怎么写啊?
这个问题第1个回答:
on delete CASCADE
??
这个
这个问题第2个回答:
我看的教程里面 就是 把学生表中的学号 作为成绩表中学号的外键 用“on delete cascade”做约束,当从学生表中删除一条记录时,系统会自动从成绩表中删除与学生表中学号相同的记录
这个问题第3个回答:
是,这个级联删除
这个问题第4个回答:
可我问的是:
前两条语句都可以通过
第三条提示错误 “在关键字 'restrict' 附近有语法错误。”
我不知道为什么会出现个错误,是restrict语法不对吗?在SQL2000的联机丛书中也没有找到
还有正确的语句应该怎么写啊?
囧。。。。
这个问题第5个回答:
t-sql没有restrict
联机丛书是这样的.
ON DELETE { NO ACTION ¦ CASCADE ¦ SET NULL ¦ SET DEFAULT } ]
[ ON UPDATE { NO ACTION ¦ CASCADE ¦ SET NULL ¦ SET DEFAULT } ]
这个问题第6个回答:
不用加on delete
默认情况下是会出错的.
这个问题第7个回答:
ss
这个问题第8个回答:
谢谢 liangCK
案例一个:
(
学号 char(10) primary key,
姓名 char(20) not null,
性别 char(4) not null,
出生年月 datetime not null,
籍贯 char(30),
所在系 char(10),
班级 char(15),
专业 char(10),
constraint sex check(性别 in('男','女')),
)
(
课程代码 char(6) primary key,
课程名称 char(20) not null,
学分 int,
)
(
学生学号 char(10),
课程代码 char(6),
成绩 int,
constraint grade check(成绩 between 0 and 100),
constraint 学号_课程 primary key(学生学号,课程代码),
constraint 学号_选课 foreign key(学生学号) references 学生个人信息(学号),
constraint 课号_选课 foreign key(课程代码) references 开设课程信息(课程代码),
)
(
学生学号 char(10) not null,
奖励编号 char(6) not null,
奖励名称 char(10) not null,
奖励级别 char(4),
奖励数额 int,
constraint 奖励主码 primary key(学生学号,奖励编号),
constraint 学号_奖励 foreign key(学生学号) references 学生个人信息(学号),
)
(
学生学号 char(10) not null,
职务编号 char(6) not null,
职务名称 char(15) not null,
职务级别 char(4),
职责范围 char(10),
constraint 职务主码 primary key(学生学号,职务编号),
constraint 学号_职务 foreign key(学生学号) references 学生个人信息(学号),
)
(
学院编号 char(6) primary key,
学院名称 char(30) not null,
地址 char(40),
类型 char(10),
联系电话 char(15),
)
(
系代号 char(6) primary key,
系名称 char(10) not null,
系办公室 char(5),
联系电话 char(15),
学院编号 char(6),
constraint 系外码 foreign key(学院编号) references 学院信息(学院编号),
)
(
专业代码 char(6) primary key,
专业名称 char(10) not null,
所属系别 char(10),
)
继续.......
创建表格
create table 教师(编号 char(10),姓名 char(10) not null,性别 char(2),年龄 int,职称 char(10),primary key(编号));
create table 学生(学号 char(10),姓名 char(10) not null,性别 char(2),年龄 int,primary key(学号));
create table 课程(课号 char(10),课程名 char(30) not null,学时 int,学分 int,primary key(课号));
create table 成绩(学号 char(10),课号 char(10),成绩 int,primary key(学号,课号),
foreign key(学号) references 学生 on delete cascade,
foreign key(课号) references 课程 on delete cascade);
修改表格
alter table 学生 add 家庭住址 char(20);
alter table 学生 add 系别 char(20);
drop table 成绩 ;
alter table 表名 add primary key;
alter table 表名 drop primary key;
alter table 表名 add foreign key 列 references表名2;
alter table 表名 drop foreign key;
create index unique 学生索引 on 学生(学号 desc, 姓名 asc);
drop index 学生索引;
select * from 表 where 查询条件
select * from 学生;
select 学号,姓名,年龄,性别 from 学生;
select 职称 from 教师;
select distinct 职称 from 教师;
select * from 教师 where 年龄>30 AND 职称!='讲师';
比较运算符: = != > < >= <= <>
特殊运算符
Between...and in like
select 姓名 from 教师 where 年龄 between 30 and 40;
select 姓名 from 教师 where 年龄>=30 and 年龄<=40;
select * from 教师 where 职称 in('教授','副教授');
not and or
select * from 教师 where 年龄>30 AND 职称!='讲师';
select 姓名 from 教师 where 职称='教授' or 职称='副教授';
%代表多个字符
_代表单个字符
select * from 教师 where 姓名 like '王%';
select * from 教师 where 编号 not like '___6';
select * from 教师 where 姓名 in not null;
条件查询的优先级
查询结果排序
order by asc/desc
select * from 教师 order by 编号 asc;
select * from 教师 order by 姓名,编号 desc;
group by,having子句
组函数count,AVG,SUM,MIN,MAX
select count(*) from 教师;
select count(distinct 职称) from 教师;
select avg(年龄) from 教师 where 职称='教授';
select 职称,count(*) from 教师 group by 职称;
select 性别,AVG(年龄) from 教师 group by 性别;
having 限制group by
select 职称,count(*) from 教师 group by 职称
having count(*)>1;
与where混合使用
select 职称,count(*) from 教师 where 年龄>30
group by 职称 having count(*)>1;
group by分组唯一性
select 职称,编号 from 教师 group by 职称;
连接查询(从几个表查询)
相等连接 非相等连接 自身连接 非匹配连接(外连接)