SQLite创建staff_ratio表时hotel_staff_ratio_id附近语法错误求助
语法错误原因
SQLite 的 CREATE TABLE 语法有明确的顺序要求:所有列的定义必须全部前置,表级约束(包括外键约束、联合CHECK约束、联合主键等)必须放在所有列定义的末尾。
你现有语句中写完 restaurant_id 列后直接插入了对应外键的表级约束,后续又接着定义 hotel_staff_ratio_id 列,打断了列定义的连续顺序,SQL 解析器在解析完第一个外键约束后预期继续接收约束定义,碰到新的列名 hotel_staff_ratio_id 就会抛出语法错误。
修复方案
有两种常用修复方式:
方案1:将所有表级外键约束移到列定义末尾
调整后的建表语句如下:
CREATE TABLE IF NOT EXISTS staff_ratio ( id INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER CHECK ( type IN (0, 1) ) NOT NULL DEFAULT 0, shift INTEGER CHECK ( shift IN (0, 2, 1)) NOT NULL DEFAULT 0, personal_count INTEGER, clients INTEGER, ratio REAL, date INTEGER NOT NULL, restaurant_id INTEGER NOT NULL, hotel_staff_ratio_id INTEGER NOT NULL, FOREIGN KEY(restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE, FOREIGN KEY(hotel_staff_ratio_id) REFERENCES hotel_staff_ratio(id) ON DELETE CASCADE )
方案2:将外键约束直接写在对应列的定义中,作为列级约束
不需要单独写表级外键声明,语法更简洁:
CREATE TABLE IF NOT EXISTS staff_ratio ( id INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER CHECK ( type IN (0, 1) ) NOT NULL DEFAULT 0, shift INTEGER CHECK ( shift IN (0, 2, 1)) NOT NULL DEFAULT 0, personal_count INTEGER, clients INTEGER, ratio REAL, date INTEGER NOT NULL, restaurant_id INTEGER NOT NULL REFERENCES restaurants(id) ON DELETE CASCADE, hotel_staff_ratio_id INTEGER NOT NULL REFERENCES hotel_staff_ratio(id) ON DELETE CASCADE )
内容的提问来源于stack exchange,提问作者3Elliajah3
相关产品推荐
相关产品推荐

