MS Access 2010创建表时CHECK约束语法错误问题求助
问题:MS Access 2010创建带CHECK约束的timeslot表报错
我需要在MS Access 2010中编写SQL语句创建timeslot表,要求为day字段添加CHECK约束,限制其取值为('M', 'T', 'W','R', 'F', 'S', 'U')。编写的SQL语句如下:
CREATE TABLE timeslot ( time_slot_id varchar (4), day varchar (1) check (day in ('M', 'T', 'W','R', 'F', 'S', 'U')), start_time time, end_time time, primary key (time_slot_id, day, start_time) );
但保存该查询时弹出错误提示:“SYNTAX ERROR IN CREATE TABLE STATEMENT”,且指向check关键字。删除CHECK约束后语句可成功执行并创建表,但无法实现字段约束。请问我使用CHECK约束的语法是否有误?该如何为day字段添加正确的约束?
解决方案
你的语法问题在于:MS Access 2010采用的Jet SQL不支持字段定义后直接追加CHECK约束的写法,必须通过CONSTRAINT子句来定义CHECK规则,具体有两种可行方式:
方式一:创建表时直接定义命名CHECK约束
CREATE TABLE timeslot ( time_slot_id varchar(4), day varchar(1), start_time time, end_time time, PRIMARY KEY (time_slot_id, day, start_time), -- 命名CHECK约束,明确限制day字段的取值范围 CONSTRAINT chk_timeslot_day CHECK (day IN ('M', 'T', 'W', 'R', 'F', 'S', 'U')) );
方式二:先创建无约束表,再添加CHECK约束
如果已经创建了不带约束的timeslot表,可以通过ALTER TABLE语句追加约束:
ALTER TABLE timeslot ADD CONSTRAINT chk_timeslot_day CHECK (day IN ('M', 'T', 'W', 'R', 'F', 'S', 'U'));
注意事项
- 为CHECK约束命名是良好的习惯,便于后续查看、修改或删除约束;
- Access的Jet SQL对标准SQL的CHECK语法支持有限,必须遵循其特定的约束定义格式。
内容的提问来源于stack exchange,提问作者Shazia Z Shaikh
相关产品推荐
相关产品推荐

