2017-12-15 24 views
1

SQL Noobはこちら。私はGPSトラッカーアプリケーションを設計しており、2つのテーブルを持っています。トラックデスクリプタテーブルと、トラックデータテーブルとを含む。トラック記述子テーブルには主キー(オートインクリメント)があり、トラックデータテーブルには外部キーがあります。私はディスクリプタテーブルから行を削除した後、そのキーより大きいキーはすべて1ずつ減らしたいと思います(autoincrementはこれを行いますか?)。私はまた、削除されたより大きいすべてのキーが減少するデータテーブルで同じことが起こることを望みます。 私はAndroid用に開発しており、この方法で行う方法を知っています:How do I add and subtract numbers in SQLite for android?。しかし、これは非常にリソース集約的なようですが、テーブル作成(トリガー)で同じことをする方法はありますか?ここ は(Javaのために残念!!!)二つのテーブルの宣言です:主キー削除後の外部キーのデクリメントSQLite

// TRACK_DESCRIPTION table create statement 
     String createTableTrackDescription = 
       "CREATE TABLE " + Constants.TABLE_TRACK_DESCRIPTION + "(" 
         + Constants.COL_TRACK_DESC_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
         + Constants.COL_TRACK_NAME + " TEXT," 
         + Constants.COL_LOCATION + " TEXT)"; 
     // TRACK_DATA table create statement 
     String createTableTrackData = 
       "CREATE TABLE " + Constants.TABLE_TRACK_DATA + "(" 
         + Constants.COL_TRACK_DATA_ID + " INTEGER," 
         + Constants.COL_LATITUDE + " REAL," 
         + Constants.COL_LONGITUDE + " REAL," 
         + Constants.COL_SPEED + " REAL," 
         + Constants.COL_ALTITUDE + " INTEGER," 
         + Constants.COL_TIMESTAMP + " INTEGER," 
         + "FOREIGN KEY(" + Constants.COL_TRACK_DATA_ID + ") REFERENCES " 
         + Constants.TABLE_TRACK_DESCRIPTION + "(" + Constants.COL_TRACK_DESC_ID + "))"; 
+0

自動インクリメントはこれを行いません。はい、そうすることは費用がかかることがあります。それが通常は落胆する理由です。 – Uueerdo

+0

なぜFK idを変更したいのですか?あなたはshouldnt btw –

+0

また、Sqlite!= MySqlite – Uueerdo

答えて

1

はこれを行うAUTOINCREMENTのでしょうか?いや、実際にはAUTOINCREMENTコーディング

、未使用のROWIDの再使用を制限します。

SQLiteのはunqiue識別子を作成し、あなたがWITHOUT ROWIDを指定しない限り、は、行ごとに、をのROWID。この識別子は、rowidと呼ばれます。

あなたはcolumn_name INTEGER PRIMARY KEYその後、COLUMN_NAMEをコーディングする場合は、がROWIDの別名である

(例えば CREATE TABLE x (_id INTEGER PRIMARY KEY, another_column TEXT)が _id 2列、列 でテーブルXを作成の別名がをのROWIDです)

rowidは一般的に次のように通常1,2などの高い値(最初は)次のようにコード化された又はされていない場合、その場合AUTOINCREMENT9223372036854775807使用されている最大数が考慮されていない限り: -

AUTOINCREMENT

場合(すなわちcolumn_name INTEGER PRIMARY KEY AUTOINCREMENT)が符号化されています。 AUTOINCREMENTは、rowidを保証するので、一度9223372036854775807に達すると、SQLITE_FULL例外が発生します。そして

  • あなたがの別名の値9223372036854775807を使用して挿入を強制する場合は、AUTOINCREMENTが符号化されている場所を別のインサートが試行された場合は、SQLITE_FULL例外が発生しますをのROWID。
AUTOINCREMENT

なしSQLiteはランダムに未使用(例えば、あなたの削除された行)を行識別子を選択します。

AUTOINCREMENTキーワードは、このように年代が大きくなりますのROWIDことを保証します。

  • WITHOUT ROWIDが符号化されていないときには、を行IDとしてユニークな一般インクリメントカラムを引き起こすことです。
  • rowidのエイリアスを作成するのは、column_name INTEGER PRIMARY KEYの使用です。
  • rowidは通常表示されません。すなわち、SELECT *は、rowidの列を含みません。しかしながら; rowidの別名が含まれます。
  • rowidを列として指定することで含めることができます。 SELECT rowid, *rowidおよび他のすべての列)
  • AUTOINCREMENTキーワードは、余分なCPU、メモリ、ディスクスペース、およびディスクI/Oオーバーヘッドを課すため、厳密に必要でない場合は避ける必要があります。通常は必要ありません。

あなたは見てみたいこと: -