【问题标题】:Sqlite database does not return PRIMARY field valueSqlite 数据库不返回 PRIMARY 字段值
【发布时间】:2013-10-06 16:40:36
【问题描述】:

我有一个 sqlite 数据库。我正在使用 SQLite3 扩展在 PHP 中连接到它。

数据库来自我迄今为止用于发票的程序。我从该程序中取出 sqlite 文件并编写了自己的基于 Web 的界面。

一切似乎都很好,除了我为现有数据库创建新表时。

数据库已创建,我可以添加新条目,并且 lastInsertRowid() 会返回正确的 Last Insert ID。

但是,当我开始从新表中选择条目时,所有 ID(主键)都是空的。

我用 SQLite 数据库浏览器打开了我的数据库,但有些奇怪。

也许首先我会给出我的数据库架构:

CREATE TABLE IF NOT EXISTS koszty
(
    id NUMERIC PRIMARY KEY DESC,
    data NUMERIC,
    nazwa TEXT,
    wartosc_netto NUMERIC UNSIGNED,
    podatek NUMERIC UNSIGNED,
    typ NUMERIC UNSIGNED,
    filename TEXT,
    opis TEXT
)

当我打开数据库时,有一个奇怪的表 sqlite_autoindex_koszty_1 似乎只对应于表。旧表没有。

另一方面,还有似乎存储自动增量 ID 的 sqlite_sequence 表。

除了 koszty 以外,所有的表都有自己的名字和 AI 值。

可能是什么原因?如何修复数据库。是我做错了什么(可能是 Sqlite 版本不同?在 Sqlite2 DB 上使用 SQLite3?)还是 SQLite 如此不一致?

【问题讨论】:

    标签: php database sqlite


    【解决方案1】:

    愚蠢的我,找到了。 字段定义应为:

    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    

    而不是

    id NUMERIC PRIMARY KEY DESC,
    

    如果没有自动增量,它会为主键创建索引而不是自动增量。

    我必须说奇怪的行为。

    【讨论】:

    • 不需要AUTOINCREMENT 关键字。重要的部分是INTEGER
    • 但是使用 Integer 它的工作原理完全相同。创建了额外的索引表。第一个定义是:“id INTEGER PRIMARY KEY DESC”这给了我上面描述的问题。后来我把它改成了 Numeric 并没有改变任何东西。
    【解决方案2】:

    要使您的某一列自动递增,您必须将其声明为 INTEGER PRIMARY KEY(而不是 NUMERIC)。 如果您没有这样的列,则lastInsertRowid 返回的值是隐藏的rowid 列。

    sqlite_autoindex_ 对象不是表,而是为主键创建的内部索引。

    【讨论】:

    • 是的,整数是我之前使用的第一个,也不是很好,所以将其更改为 NUMERIC。我认为主要是缺少自动增量关键字。谢谢回答!
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多