これは実行されない:SQLite ROWIDをプライマリキーとして使用できないのはなぜですか?
create table TestTable (name text, age integer, primary key (ROWID))
エラーメッセージがある:
11-23 11:05:05.298:ERROR /データベース(31335):失敗1(表のTestTableという名前のない列を持っていませんROWID)を作成する際に0x2ab378にTestTable(名前テキスト、年齢整数、主キー(ROWID))を作成します。私は潜在的に自動インクリメントの主キーと外部キーを必要とするソリューションとして
ROWID
を見ることができcreate table TestTable (name text, age integer); insert into TestTable (name, age) values ('Styler', 27); select * from TestTable where ROWID=1;
:のTestTableが作成された後しかし、これはうまく準備し、実行
アプリケーション層のデータとしてデータとして使用されることはありません。 ROWID
はデフォルトでselect
の結果セットから隠されているため、これをアプリケーションロジックから隠蔽したままプライマリキーに関連付けるとよいでしょう。 OracleBlog: ROWNUM and ROWIDこれは不可能であり、勧めることはできませんが、それ以外の説明はあまりありません。
だから、「これは可能です」という答えは間違いなく/薦められないので、多分「なぜ」ではないのですか? SQLite.orgから
ROWNUMは、レコードが更新されるたびに変更され、ROWIDは結果セットのソートまたは順序に基づいて変更されます。 RowNumは悪いです。マスターに変更が加えられるたびにすべての外部キーを更新する必要があるからです。結果セットが作成されて順序付けされるまで、IDは存在しないので、(オーバーヘッドが多い)ROWIDは悪いです。それが存在しない場合、あなたはそれに参加することはできません。 – xQbert
@xQbert ROWIDが主キーによって参照されている場合、結果セットの列の順序に基づいてどのように変更されますか? – styler1972
テーブルにROWIDが存在しませんtesttableを記述してください。 ROWIDはそこにはありません。 ROWIDはシステム列およびシステム管理値です。システム列にPKを設定することはできません。それを行う権限がありません。上記について:私はそれを後方に持っています。 ROWIDは、where vse selectに基づいて変更するupdate vs ROWNUMに基づいて変更できます。 – xQbert