代码之家  ›  专栏  ›  技术社区  ›  Dariush Eivazi

Sqlite“CREATE TABLE”SQL

  •  -1
  • Dariush Eivazi  · 技术社区  · 1 年前

    此SQL语句(对于SQLITE)有什么问题:

    CREATE TABLE IF NOT EXISTS "history" 
    (
        "inscode" INTEGER NOT NULL,
        "yyyyymmdd" INTEGER NOT NULL,
        "basic_data" INTEGER NOT NULL,
        "instrument_state" INTEGER NOT NULL,
        "static_thresholds" INTEGER NOT NULL,
        "trades" INTEGER NOT NULL,
        "closing_price" INTEGER NOT NULL,
        "best_limits" INTEGER NOT NULL,
        "client_type" INTEGER NOT NULL,
        "shareholders" INTEGER NOT NULL,
        PRIMARY KEY("inscode", "yyyymmdd")
    ) WITHOUT ROWID
    

    我收到以下错误消息:

    执行已完成,但出现错误。
    结果:PRIMARY KEY和UNIQUE约束中禁止的表达式

    1 回复  |  直到 1 年前
        1
  •  1
  •   user2722968    1 年前

    这是由于的一个不幸的交互作用 quirk 8 在sqlite3中,列定义中存在拼写错误:

    • 列定义说 "yyyyymmdd" ;请注意,这里有五个“y”,而不是四个。这是一个打字错误。
    • 由于历史原因,“如果双引号字符串与任何有效标识符不匹配,SQLite也会将其解释为字符串文字。这一错误特征意味着拼写错误的双引号标识符将被解释为字符串文本,而不是生成错误。”;请参阅 docs here .

    PRIMARY KEY 子句指 "yyyymmdd" (四个“y”),但列定义为 “yyyy-mmdd” (五个“y”),上述怪癖开始出现 “yyyy-mmdd” 被解释为字符串文字,这就是sqlite3当时抱怨的“主键中的表达式”。

    解决方案是修复列定义中的拼写错误。。。