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
を実行しています。
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が失敗するか、間違ったデータが(間違った列の値で)生成されます。
はい、これは可能です。 SQLite FAQ によると:
INTEGER PRIMARY KEY
と宣言された列は自動インクリメントされます。
SQLiteの公式ドキュメント が主題について述べなければならないことです(太字と斜体は私のものです):
AUTOINCREMENTキーワードは、余分なCPU、メモリ、ディスク容量、ディスクI/Oオーバーヘッドを課し、厳密に必要でない場合はを避ける必要があります。通常は必要ありません。
SQLiteでは、タイプがINTEGER PRIMARY KEYの列は、ROWID(WITHOUT ROWIDテーブルを除く)のエイリアスであり、常に64ビットです。符号付き整数。
INSERTの場合、ROWIDまたはINTEGER PRIMARY KEY列に値が明示的に指定されていないである場合、自動的にanunusedが入力されます整数、通常現在最大のROWIDよりも1つ多いuse.これは、AUTOINCREMENTキーワードが使用されているかどうかに関係なく当てはまります。
AUTOINCREMENTキーワードがINTEGER PRIMARY KEYの後に表示される場合、自動ROWID割り当てアルゴリズムがprevent the再利用を防止しますof ROWIDs of lifetime of the database.つまり、AUTOINCREMENTの目的は、以前に削除された行からROWIDが再利用されないようにすることです。
これを読みましたか? AUTOINCREMENTフィールドの作成方法
INSERT INTO people
VALUES (NULL, "John", "Smith");
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
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
ROWIDの横に、独自の自動増分フィールドを定義できますが、推奨されていません。自動的に増加するROWIDを使用する場合は、常により優れたソリューションです。
AUTOINCREMENT
キーワードは、余分なCPU、メモリ、ディスク領域、およびディスクI/Oオーバーヘッドを課すため、厳密に必要でない場合は避ける必要があります。通常は必要ありません。
詳細については here をお読みください。
私はこの答えが少し遅れていることを知っています。
この回答の私の目的は、現在または将来、SQLiteでこの種の課題に遭遇し、苦労しているすべての人の参照用です。
クエリを振り返ってみると、次のようになっているはずです。
CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));
それは私の終わりに機能します。そのようです、
SQLiteを使用している場合に備えて、 DBite for SQLite を確認することをお勧めします。異なるプラットフォームでも動作します。