创建Registered guest表时遇SQL语法错误,请求协助排查
排查你的SQL语法错误
嘿,我来帮你揪出这个SQL里的问题——你遇到的syntax error near "guest"其实是个很常见的小坑!
核心错误:带空格的标识符
最直接导致报错的原因是表名Registered guest包含空格。SQL的默认规则里,标识符(表名、列名这类)不能直接带空格,如果你一定要用带空格的名称,得用特定符号把它包裹起来,不同数据库的写法略有区别:
- MySQL/MariaDB:用反引号
`包裹,比如`Registered guest` - PostgreSQL/Oracle:用双引号
"包裹,比如"Registered guest" - SQL Server:用方括号
[]包裹,比如[Registered guest]
不过真心建议你尽量避免用带空格的标识符,改成RegisteredGuest(驼峰式)或者registered_guest(下划线分隔)这种规范命名,不仅能避开这类语法问题,也让代码更易读、符合行业习惯。
另外两个需要修正的小问题
除了表名,你的SQL还有两处细节要调整:
- CHECK约束的顺序错了:你在定义
Start_date时加的CHECK (Start_date <=End_date)里用到了End_date,但End_date是在Start_date之后才定义的,数据库会找不到这个列。解决办法是把这个CHECK约束移到End_date定义之后,或者改成表级约束(放在所有列定义的后面)。 - 列名和整数类型的小问题:
Number_ of_ accompanying guests这个列名也带空格,同样要处理;另外integer(5)这种写法在多数数据库里没必要,integer类型不需要指定长度,直接写integer就好(MySQL里的INT(5)只是显示宽度,不影响实际存储,完全可以省略)。
修正后的SQL示例(推荐规范命名版,MySQL为例)
/*Create the Registered guest table*/ CREATE TABLE registered_guest ( Guest_ID INTEGER NOT NULL, F_Name VARCHAR(50) NOT NULL, L_Name VARCHAR(50) NOT NULL, Start_date DATE NOT NULL, End_date DATE NOT NULL, Dietary_needs VARCHAR(20), Acco_needs VARCHAR(50), number_of_accompanying_guests INTEGER, PRIMARY KEY (Guest_ID), CHECK (Start_date <= End_date) -- 移到表级,确保End_date已定义 );
如果非要保留带空格的名称,MySQL版本的写法如下:
/*Create the Registered guest table*/ CREATE TABLE `Registered guest` ( `Guest_ID` INTEGER NOT NULL, `F_Name` VARCHAR(50) NOT NULL, `L_Name` VARCHAR(50) NOT NULL, `Start_date` DATE NOT NULL, `End_date` DATE NOT NULL, `Dietary_needs` VARCHAR(20), `Acco_needs` VARCHAR(50), `Number of accompanying guests` INTEGER, PRIMARY KEY (`Guest_ID`), CHECK (`Start_date` <= `End_date`) );
这样执行就不会再报错啦!
内容的提问来源于stack exchange,提问作者sql learner
相关产品推荐
相关产品推荐

