创建含CHECK约束的Tour表时遇SQL错误:提示需符号名/保留字需反引号
问题分析与解决方案
我来帮你搞定这个创建表时的报错问题!你遇到的错误其实是语法结构问题引发的误导性提示,咱们一步步拆解清楚:
1. CHECK约束的核心语法错误
MySQL里的CHECK约束必须用括号包裹校验条件,你写的CHECK Cost BETWEEN 1500 and 2500缺少了括号,这会让SQL解析器误判语法逻辑,进而抛出类似“保留关键字”的错误提示——本质是解析失败后的误导,并非Cost是保留关键字。
2. 隐藏的Decimal精度不匹配问题
你定义的Cost decimal(4,2)精度不够:decimal(4,2)表示总共有4位数字(其中2位是小数),最大值只能存99.99,但你设置的默认值是2000.00,这会直接导致默认值无法存入,后续执行也会报错。需要把精度调整为decimal(6,2)(总6位,小数2位,可容纳到9999.99)才能适配你的默认值。
修正后的完整SQL语句
CREATE TABLE Tour ( Tour_ID int AUTO_INCREMENT, Tour_Title VARCHAR(15) NOT NULL, Cost decimal(6,2) DEFAULT 2000.00, -- 修正精度,去掉默认值的引号(数值类型无需字符串包裹) CONSTRAINT tour_pk PRIMARY KEY (Tour_ID), CONSTRAINT Ck_cost CHECK (Cost BETWEEN 1500 AND 2500) -- 给CHECK条件添加括号 );
补充说明:
- 默认值
2000.00不需要单引号包裹,直接写数值是更规范的写法; - 如果你使用的MySQL版本低于8.0.16,CHECK约束会被数据库忽略(不会报错但不生效),这种情况下建议用触发器来实现金额范围的校验逻辑。
内容的提问来源于stack exchange,提问作者user7221806
相关产品推荐
相关产品推荐

