0

私はsqlite DBを持っています。PHPで接続するためにSQLite3拡張機能を使用しています。

データベースは、私が今まで請求書に使用していたプログラムのものでした。そのプログラムから sqlite ファイルを取り出し、独自の Web ベースのインターフェイスを作成しました。

既存のデータベースに新しいテーブルを作成した場合を除いて、すべて問題ないようです。

データベースが作成され、新しいエントリを追加でき、lastInsertRowid() が適切な最終挿入 ID を返しました。

ただし、新しいテーブルからエントリを選択し始めたとき、すべての ID (主キー) が空でした。

SQLite データベース ブラウザでデータベースを開いたところ、何かがおかしいです。

おそらく最初に、db スキーマを指定します。

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
)

DBを開くと、テーブルのみに対応しているように見える奇妙なテーブルsqlite_autoindex_koszty_1があります。古いテーブルにはありません。

一方、自動インクリメント ID を格納していると思われる sqlite_sequence テーブルもあります。

koszty を除くすべてのテーブルには、ここに名前と AI 値があります。

理由は何ですか?DBを修正する方法。それは私が何か間違ったことをしているのですか(おそらくSqliteのバージョンが違うのでしょうか?Sqlite2 DBでSQLite3を使用していますか?)、それともSQLiteの一貫性がありませんか?

4

2 に答える 2

1

バカ、見つけた。フィールド定義は次のとおりです。

id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,

それ以外の

id NUMERIC PRIMARY KEY DESC,

自動インクリメントがない場合、自動インクリメントではなく主キーのインデックスが作成されます。

私が言わなければならない奇妙な行動。

于 2013-10-06T17:42:27.750 に答える
0

列の 1 つを自動インクリメントするには、それを(NUMERIC ではなく) INTEGER PRIMARY KEYとして宣言する必要があります。そのような列がない場合、 によって返される値は非表示の列lastInsertRowidに対するものです。rowid

sqlite_autoindex_オブジェクトはテーブルではなく、主キー用に作成された内部インデックスです。

于 2013-10-06T17:41:00.800 に答える