2011-11-23 14 views
9

これは実行されない: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から

+1

ROWNUMは、レコードが更新されるたびに変更され、ROWIDは結果セットのソートまたは順序に基づいて変更されます。 RowNumは悪いです。マスターに変更が加えられるたびにすべての外部キーを更新する必要があるからです。結果セットが作成されて順序付けされるまで、IDは存在しないので、(オーバーヘッドが多い)ROWIDは悪いです。それが存在しない場合、あなたはそれに参加することはできません。 – xQbert

+0

@xQbert ROWIDが主キーによって参照されている場合、結果セットの列の順序に基づいてどのように変更されますか? – styler1972

+0

テーブルにROWIDが存在しませんtesttableを記述してください。 ROWIDはそこにはありません。 ROWIDはシステム列およびシステム管理値です。システム列にPKを設定することはできません。それを行う権限がありません。上記について:私はそれを後方に持っています。 ROWIDは、where vse selectに基づいて変更するupdate vs ROWNUMに基づいて変更できます。 – xQbert

答えて

28

テーブルは 列がROWIDの別名になること、次いで、タイプINTEGER PRIMARY KEYのカラムが含まれている場合。上記の を記述した元の3つの名前またはINTEGER PRIMARY KEY列に与えられた名前のいずれかを使用して、ROWID にアクセスできます。これらのすべての の名前は、お互いのエイリアスであり、いずれの コンテキストでも同じように機能します。

ただプライマリキーとして使用してください。

+1

任意の自動インクリメントプライマリキーを追加することによって、基本的にROWIDをプライマリキーとして使用しています。それが簡単だったので、私は単に主としてrowidを宣言することができたと思っていた。明らかに、それ以上のことはありません。それは私が違った考えをしていることです。私には恥ずかしく思います。D – styler1972

+2

[自動インクリメントキーを追加すると動作が少し変わります](http://www.sqlite.org/autoinc.html)。主に単調増加する値が必要な場合は、ROWIDは必ずしも適切ではありません。 – user2864740

関連する問題