You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:07