web-dev-qa-db-ja.com

sqliteに自動インクリメントはありますか?

Sqlite で自動インクリメントprimary keyを使用してテーブルを作成しようとしています。これが本当に可能かどうかはわかりませんが、他の分野を指定するだけでいいと思っています。

例えば:

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

次に、値を追加するときに、次のことだけを行うことを望んでいました。

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

これも可能ですか?

Windows 7でcygwinの下でsqlite3を実行しています。

93
ewok

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が失敗するか、間違ったデータが(間違った列の値で)生成されます。

146
Larry Lustig

はい、これは可能です。 SQLite FAQ によると:

INTEGER PRIMARY KEYと宣言された列は自動インクリメントされます。

47
Matt Hulse

本日— 2018年6月


SQLiteの公式ドキュメント が主題について述べなければならないことです(太字と斜体は私のものです):

  1. AUTOINCREMENTキーワードは、余分なCPU、メモリ、ディスク容量、ディスクI/Oオーバーヘッドを課し、厳密に必要でない場合はを避ける必要があります。通常は必要ありません。

  2. SQLiteでは、タイプがINTEGER PRIMARY KEYの列は、ROWID(WITHOUT ROWIDテーブルを除く)のエイリアスであり、常に64ビットです。符号付き整数。

  3. INSERTの場合、ROWIDまたはINTEGER PRIMARY KEY列に値が明示的に指定されていないである場合、自動的にanunusedが入力されます整数、通常現在最大のROWIDよりも1つ多いuse.これは、AUTOINCREMENTキーワードが使用されているかどうかに関係なく当てはまります。

  4. AUTOINCREMENTキーワードがINTEGER PRIMARY KEYの後に表示される場合、自動ROWID割り当てアルゴリズムがprevent the再利用を防止しますof ROWIDs of lifetime of the database.つまり、AUTOINCREMENTの目的は、以前に削除された行からROWIDが再利用されないようにすることです。

14
Filipp W.

これを読みましたか? AUTOINCREMENTフィールドの作成方法

INSERT INTO people
VALUES (NULL, "John", "Smith");
9
Uku Loskit

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
3
wzbozon

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

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

AUTOINCREMENTキーワードの基本的な使用法は次のとおりです。

CREATE TABLE table_name(column1 INTEGER AUTOINCREMENT、column2 datatype、column3 datatype、..... columnN datatype、);

例以下を参照してください:COMPANYテーブルを次のように作成することを検討してください。

sqlite> CREATE TABLE TB_COMPANY_INFO(ID INTEGER PRIMARY KEY AUTOINCREMENT、NAME TEXT NOT NULL、AGE INT NOT NULL、ADDRESS CHAR(50)、SALARY REAL);

次に、次のレコードをテーブルTB_COMPANY_INFOに挿入します。

INSERT INTO TB_COMPANY_INFO(NAME、AGE、ADDRESS、SALARY)VALUES( 'MANOJ KUMAR'、40、 'Meerut、UP、INDIA'、200000.00);

レコードを選択しますSELECT * FROM TB_COMPANY_INFO ID NAME AGE ADDRESS SALARY 1 Manoj Kumar 40 Meerut、UP、INDIA 200000.00

2
mkumar0304

ROWIDの横に、独自の自動増分フィールドを定義できますが、推奨されていません。自動的に増加するROWIDを使用する場合は、常により優れたソリューションです。

AUTOINCREMENTキーワードは、余分なCPU、メモリ、ディスク領域、およびディスクI/Oオーバーヘッドを課すため、厳密に必要でない場合は避ける必要があります。通常は必要ありません。

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

2
sonvx

私はこの答えが少し遅れていることを知っています。
この回答の私の目的は、現在または将来、SQLiteでこの種の課題に遭遇し、苦労しているすべての人の参照用です。

クエリを振り返ってみると、次のようになっているはずです。

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

それは私の終わりに機能します。そのようです、

enter image description here

SQLiteを使用している場合に備えて、 DBite for SQLite を確認することをお勧めします。異なるプラットフォームでも動作します。

1
Kent Aguilar