忍者ブログ
  • 2025.01
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 2025.03
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2025/02/02 12:17 】 |
[C# SQLite]SQLiteってPRIMARY KEYにTEXT型は指定できないの?
最近、C#でSQLiteを使ってファイル仕分けソフトを作っている訳なんだが、ふと不明な点が出てきた。なぜかPRIMARY KEYにTEXT型を指定すると以下のエラーが表示される。

System.Data.SQLite.SQLiteException: 'SQL logic error or missing database


んーなんでだ。SQLiteってPRIMARY KEYにTEXT型は指定できないのか?



■SQLiteってPRIMARY KEYにTEXT型は指定できないの?
→結論から言うと、色々勘違いはあったけど、できる。



T-SQLだと、出来なかったよな。
実際にManagement Studioを使ってやってみると、以下のエラーが発生する。

---
create table friend(name text, old int, address text, primary key(name, old));

メッセージ 1919、レベル 16、状態 1、行 1
テーブル 'friend' の列 'name' の型は、インデックスのキー列として使用するには無効です。
メッセージ 1750、レベル 16、状態 0、行 1
制約を作成できませんでした。以前のエラーを調べてください。
---
※ちなみに上の構文は信用ある素晴らしい某サイトから借りてきました。ありがとう!

んー。T-SQLだと確か制約があって、文字数が指定されていないとエラーになったんだよな。
同じような仕様だからSQLiteでもエラーになるのか?

……いや、いくら何でもそんな訳ねーよ。文字列型の主キー設定できんとか原始時代かよ。
ということで色々と探す。めっちゃ探す。

■原因はこんな勘違い
……あれ、このエラーメッセージってPRIMARY KEYでエラーになっているんじゃなくね?
System.Data.SQLite.SQLiteException: 'SQL logic error or missing database

!!!
おい、bin/debugのSQLフォルダのSQLファイルが古いままじゃねーか。
そりゃSQL文が違うんだからエラー出るわ……

結局、bin/debug内のSQLを
create table friend(name text, old int, address text, primary key(name, old));
が入っている最新のものにしたら直った。


■色々あったけど
いやー直って良かった。
T-SQLだとTEXT型のカラムはPRIMARY KEYに出来なかったけど、
SQLiteだと出来るのね。勉強になりました。はい。

ちなみにこれにかけた時間。三時間。マジかよぅ……。





PR
【2017/05/11 02:43 】 | SQLite | コメント(0)
<<SQLiteの照合順序について簡単なレポート | ホーム | プログラムとは関係ないが>>
コメント
コメント投稿














<<前ページ | ホーム | 次ページ>>