2016-04-11 5 views
0

keyIDが既に各行に設定されている古いデータベースからのデータを挿入するため、最初にkeyID列がAUTO INCREMENTにはないテーブルを作成しています変更することはできません。ですから、すべてのデータが移動された後に列をAUTO INCREMENTに設定することは可能でしょうか?私はすべてのデータを移動した後、例えば10行が転送されてきたし、いくつかの数字は、例えば、欠落している可能性がありので、これまで私は、自動インクリメントに鍵IDを設定している場合keyIDsは、だから、SQLiteで列の自動インクリメントを変更する

ALTER TABLE tbl_name MODIFY COLUMN keyID_id INT auto_increment 

:私はこれを見てきました1 、2,3,5,6,7 ... 15

キーインクリメントにkeyIDを設定した後、次の行はkeyID 16になると思いますか?

+0

オートインクリメントの列に明示的な値を挿入することはできます。 –

+0

あなたはそう言っています...私はテーブルの列の自動インクリメントを作成することができ、私は特定のIDを持つデータを挿入することができますか? –

+0

[documentation](http://www.sqlite.org/autoinc.html)は、「INSERTでは、ROWIDまたはINTEGER PRIMARY KEY列に明示的に値が与えられていないと、自動的に未使用の整数... " –

答えて

0

ここで最初に言うことは、SQLiteには列の設定を変更する構文がないことです。元のテーブルの名前を変更し、必要なスキーマを持つ新しいテーブルを作成し、名前を変更したテーブルから新しいテーブルにコピーする必要があります。

あなたがAUTOINCREMENTのSQLiteでテーブルを作成するときに、あなたのテーブルにAUTOINCREMENTフラグを追加するにはあなたのコードは、今、この

SQLiteCommand cmd = new SQLiteCommand(); 
cmd.Connection = yourConnection; 
cmd.CommandText = "ALTER TABLE tblName RENAME TO tmp_tblName"; 
cmd.ExecuteNonQuery(); 
cmd = new SQLiteCommand(@" 
    CREATE TABLE tblName 
    (ID INTEGER PRIMARY KEY AUTOINCREMENT, 
    AnotherField NVARCHAR(100) NOT NULL)", cnn); 
cmd.ExecuteNonQuery();    
cmd.CommandText = "INSERT INTO tblName (ID, AnotherField) SELECT ID, AnotherField FROM tmp_tblName"; 
cmd.ExecuteNonQuery(); 

のようなものではsqlite_sequenceと呼ばれる内部テーブルに新しい行を追加します。あなたはあなたがフィールド配列の値がPRIMARY KEYフィールドに挿入された最大値に等しいことがわかります。このテストコードを実行した場合、このテーブルには、通常のADO.NETクラス

cmd.CommandText = "SELECT seq FROM sqlite_sequence WHERE name = 'tblName'"; 
int lastInsertedValue = Convert.ToInt32(cmd.ExecuteScalar()); 
Console.WriteLine(lastInsertedValue); 

で読み取ることができます。 これで、テーブルに新しいレコードを挿入しようとすると、AUTOINCREMENTフラグが期待通りに機能し始め、新しいレコードがシーケンスから次の値を受け取ることがわかります。

0

SQLite documentationsomepostsは、SQLiteのalter tableコマンドが非常に制限されているため、このような変更を許可してはいけません.PKプロパティを変更することは可能です。どのような私のために働いていたことだった。

  1. DB Browser for SQLite その後インサートを
  2. 変更列定義列のフィールド1をCREATE TABLE "test" (フィールド1 INTEGER,フィールド2でテーブルを作成しますTEXT,)
  3. を挿入し、任意のデータはずの列の後、自動インクリメントのID Field1。

これはプログラム的に行う必要がある場合には適切ではない可能性があることを認めなければなりません。

関連する問題