Sqlite“创建表”SQL

问题描述 投票:0回答: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 约束中禁止表达式

sql sqlite
1个回答
0
投票

这是由于 sqlite3 中 quirk 8 的不幸交互以及列定义中存在拼写错误造成的:

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

由于

PRIMARY KEY
子句引用
"yyyymmdd"
(四个“y”),但列定义是
"yyyyymmdd"
(五个“y”),因此上面提到的怪癖开始出现,
"yyyyymmdd"
被解释为字符串文字,这就是 sqlite3 抱怨的“主键中的表达式”。

© www.soinside.com 2019 - 2024. All rights reserved.