22

sqlite3 faqでは、null 値が与えられた整数の主キーは自動インクリメントされることが言及されています。しかし、これは私には起こっていません。

sqlite3 のテーブルをレプリケートし、CREATE TABLE dummy( serial_num INTEGER PRIMARY KEY, name TEXT);Python を使用して入力します。

import sqlite3 as lite
con = lite.connect('some.db')
cur=con.cursor()
data = "someone's name"
cur.execute("INSERT INTO dummy VALUES(NULL, ?)", data)
con.commit()

最初の属性 serial_num は空白で表示されますが、name 属性は問題ありません。私がそうするSELECT serial_num FROM dummyと、たくさんの空白ができます。私は何を間違っていますか?

4

2 に答える 2

28

これは SQLite の癖の 1 つです。細かいマニュアルから:

SQL 標準によると、PRIMARY KEY は常に NOT NULL を意味する必要があります。残念ながら、長年にわたるコーディングの見落としにより、これは SQLite には当てはまりません。列が INTEGER PRIMARY KEY でない限り、SQLite は PRIMARY KEY 列に NULL 値を許可します。標準に準拠するように SQLite を変更することはできました (将来的には変更する可能性があります) が、見落としが発見されるまでに、SQLite は非常に広く使用されていたため、問題を修正した場合にレガシー コードが壊れてしまうのではないかと恐れていました。

INTEGER PRIMARY KEYに関するドキュメントは、列が自動インクリメントするこの特別な INTEGER PRIMARY KEY であるために正確に何が必要かについて少し不明確ですが、実際には、NULL 値を使用して挿入時に「次の自動インクリメント値を教えてください」という意味:

create table dummy (
    serial_num integer primary key not null,
    name text
);

を省略した場合は、次のnot nullように挿入する必要があります。

insert into dummy (name) values (?)

の自動インクリメント値を取得しますserial_numserial_numそれ以外の場合、SQLite には、「次の自動インクリメント値を与える」という意味の NULL と、 「列が NULL を許可しているためにNULL 値を入れる」という意味の NULL の違いを伝える方法がありません。

于 2012-07-15T07:16:02.360 に答える
3

上記の挿入構文は、がないと機能しないようですnot null

次に例を示します。上で指定した挿入形式を使用しても、ID フィールドは自動インクリメントされないことに注意してください。

sqlite> .schema logTable
CREATE TABLE logTable (ID INTEGER PRIMARY_KEY, ts REAL, level TEXT, message TEXT);
sqlite> INSERT into LOGTABLE (ts, level, message) VALUES (111, "autoinc test", "autoinc test");
sqlite> select * from logtable where ts = 111;
|111.0|autoinc test|autoinc test
sqlite> 

NOT NULL 回避策で機能します。

sqlite> create TABLE logTable (ID INTEGER PRIMARY KEY NOT NULL, ts REAL, level TEXT, message TEXT);
sqlite> INSERT into LOGTABLE (ts, level, message) VALUES (222, "autoinc test", "autoinc test"); 
sqlite> select * from logtable where ts = 222;
1|222.0|autoinc test|autoinc test

以前の回答にコメントするのではなく、これを新しい回答として投稿して申し訳ありませんが、評判スコアが低すぎてコメントを追加できません。別の挿入ステートメントは適切な回避策ではないことに注意することが重要だと考えました.

于 2016-01-10T06:53:21.907 に答える