2011-10-26 8 views
72

Sqlite3で自動インクリメントのプライマリキーを持つテーブルを作成しようとしています。私はこれが本当に可能かどうかはわかりませんが、他のフィールドを指定するだけでいいと思っています。例えば:私は値を追加するときsqliteに自動インクリメントはありますか?

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20)); 

その後、私はしなければならないに期待していた。

INSERT INTO people 
VALUES ("John", "Smith"); 

はこのさえ可能ですか?

私は

答えて

113

あなたは無料でROWIDと呼ばれるものを手に入れます。これは、あなたがそれを求めるかどうかにかかわらず、すべてのSQLiteテーブルにあります。

INTEGER PRIMARY KEY型の列を含めると、その列は自動ROWID列を指します(別名です)。

ROWID(あなたがそれを呼び出す名前で)には、あなたが期待するように、行を挿入するたびに値が割り当てられます。 INSERTにNULL以外の値を明示的に割り当てると、自動インクリメントではなく指定された値が取得されます。 INSERTにNULLの値を明示的に割り当てると、次の自動インクリメント値が取得されます。

INSERT INTO people VALUES ("John", "Smith"); 
を、代わりに

INSERT INTO people (first_name, last_name) VALUES ("John", "Smith"); 

を使用します。

また、あなたは避けるべきです。最初のバージョンは非常に脆弱です。テーブル定義内の列を追加、移動、削除すると、INSERTは失敗したり、間違ったデータ(間違った列の値)を生成します。

+28

ROWIDは真のオートインクリメントと全く同じではありません。これは、SAME値が複数回生成される可能性があるからです。たとえば、空の表を使用すると、3行を挿入すると3番目の行にROWIDが3になります。しかし、2行を挿入し、最後の行を削除して別の行を挿入し、2行目と同じように、3行目の行に2のROWIDを与えます。したがって、テーブルが削除が発生するテーブル内のROWIDを参照し、関連テーブルで削除またはROWIDの無効化が行われない場合、明らかな深刻な問題があります。 – Nick

+2

答えが明白でない場合は、select文でROWIDを使用できます。 'rowid from people;' –

8

あなたがこれを読んでいるWindows 7でcygwinsqlite3を実行しているのですか? How do I create an AUTOINCREMENT field.

INSERT INTO people 
VALUES (NULL, "John", "Smith"); 
+0

あなたが言っていることは、私がやろうとしていることは不可能だと思っていますが、私は一種のシミュレーションをすることができます。私は挿入にnullを使用する必要がありますか? – ewok

+1

あなたは何もする必要はありませんが、常にNULLをIDとして挿入するだけで、sqliteが内部的にどのように処理するかが説明されています。 –

+5

INSERTの列のリストを指定しない場合は、INSERTのNULLは必須です(この場合、列の数と正確に一致する数の値が必要であり、NULLをプレースホルダとして使用する必要があります)。しかし、列のリストを指定せずにINSERTを実行することは決して良いことではありません。列のリストを指定する場合は、autoincrement列とNULL値の両方を省略してください。期待どおりの結果が得られます。 –

24

はい、可能です。 SQLiteのドキュメントによると、 'INTEGER PRIMARY KEY宣言された列は自動インクリメントされます。' (http://www.sqlite.org/autoinc.html

+6

この文書で言及されているように、また文書で説明されているように、IDをNULLにする必要があります。 –

+11

あなたは列のリストをINSERTにしないとNULLを使用する必要があります。決して良い方法ではありません。列を指定すると、自動インクリメント列を省略して次の値を受け取ることができます。 –

2

rowidの横に独自の自動増分フィールドを定義できますが、推奨されません。自動的に増加するROWIDを使用すると、常により良い解決策になります。

AUTOINCREMENTキーワードは余分なCPU、メモリ、ディスク容量、および ディスクI/Oのオーバーヘッドを課し、厳密に必要でない場合は避けるべきです。通常は不要です です。

詳細については、hereをお読みください。

+0

明らかにROWIDが常に自動的に増加するとは限りません。Nickのコメントを参照してください。 – rogerdpack

+0

本当ではありません。自動インクリメントは、IDを再利用しないため、いくつかの点で優れています。これは、多くのシステムにとって非常に重要な要件です。 –

2

SQLite AUTOINCREMENTは、テーブル内のフィールドの値を自動インクリメントするために使用されるキーワードです。特定の列名を持つ表を作成するときにAUTOINCREMENTキーワードを使用して自動増分することで、フィールド値を自動増分できます。

キーワードAUTOINCREMENTは、INTEGERフィールドでのみ使用できます。 構文:次のように

AUTOINCREMENTキーワードの基本的な使用方法である:

はテーブルtable_name( COLUMN1 INTEGER AUTOINCREMENT、 COLUMN2データ型、 COLUMN3データ型、 ..... columnNデータ型、 )を作成;例については

以下を参照してください。 次のように作成されるCOMPANYテーブルを考えてみましょう:

のsqlite> TABLE TB_COMPANY_INFO( ID INTEGER PRIMARY KEY AUTOINCREMENT、NOT NULLを 名のテキスト、NOT NULLと AGEのINT、 アドレスを作成CHAR(50)、 、SALARY REAL );今

、テーブルTB_COMPANY_INFOに次のレコードを挿入:

INSERT INTO TB_COMPANY_INFO(氏名、年齢、住所、SALARY) VALUES( 'MANOJ KUMAR'、40 'メーラト、UP、インド、200000.00)。 * TB_COMPANY_INFO FROM ID NAMEのAGEアドレスSALARY 1 Manojさんクマー40メーラト、UP

今記録 を選択し、SELECT、INDIA 200000.00

2

一つはPRIMARY KEY近くAUTOINCREMENTキーワードを指定しないでください。自動インクリメントの主キーを作成し、挿入する 例:

$ sqlite3 ex1 

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL); 

INSERT INTO room(name, home_id) VALUES ('test', 'home id test'); 

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2'); 

SELECT * FROM room; 

が得られます:

1|test|home id test 
2|test 2|home id test 2 
0

を、私はこの答えは少し遅れている知っています。
この回答の私の目的は、現在または将来、SQLiteでこのタイプの挑戦に遭遇した場合、誰もが参考になることです。

あなたのクエリを振り返ってみると、このようなものになります。

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20)); 

これは私の目的です。

enter image description here

は、念のためにあなたはSQLiteので作業しているので、同じようにあなたが DB Browser for SQLiteをチェックアウトするために、私は示唆しています。異なるプラットフォームでも動作します。

関連する問題