2012-04-02 3 views
0

Windows x64 Visual Studio 2010でSqlite 3.7.11を使用しています。以下の例は、sqlite3.exeツールから実行できます。私はコードから同じ失敗を得る。引用符で囲まれた値を曖昧な列名として拒否するSqlite

は、このテーブルを考える:

PRAGMA foreign_keys=ON; 

CREATE TABLE hashes(id INTEGER PRIMARY KEY, hash CHARACTER(4) NOT NULL UNIQUE); 
CREATE TABLE sources(id INTEGER PRIMARY KEY, source VARCHAR(64) NOT NULL UNIQUE); 
CREATE TABLE files(hash_id INTEGER, source_id INTEGER, filename VARCHAR(2048), extension VARCHAR(16), 
FOREIGN KEY(hash_id) REFERENCES hashes(id) 
FOREIGN KEY(source_id) REFERENCES sources(id) 
UNIQUE(hash_id, source_id, filename)); 

そして、この初期データ:

INSERT INTO hashes VALUES(?, "abcd"); 
INSERT INTO sources VALUES(?, "mysource"); 

私はこのような行を追加しています。ファイルテーブルは上記の制約に従ってハッシュテーブルとソーステーブルを参照しています。

INSERT INTO files (hash_id, source_id, filename, extension) 
SELECT hashes.id, sources.id, "filename.ext", "ext" 
FROM hashes, sources 
WHERE hashes.hash = "abcd" AND sources.source = "mysource"; 

「id」がファイル名または拡張フィールドのいずれかに表示されるまで、すべて正常に動作します。これは意味をなさない - それは引用されている。これらの挿入の両方が失敗します。

INSERT INTO files (hash_id, source_id, filename, extension) 
SELECT hashes.id, sources.id, "id", "" 
FROM hashes, sources 
WHERE hashes.hash = "abcd" AND sources.source = "mysource"; 

INSERT INTO files (hash_id, source_id, filename, extension) 
SELECT hashes.id, sources.id, "filename.id", "id" 
FROM hashes, sources 
WHERE hashes.hash = "abcd" AND sources.source = "mysource"; 

エラー:あいまいな列名:ID

が、私はさらに何とか引用された値をエスケープする必要がありますか?

+0

最後の "id"はどこに属していますか?つまり、どの列が「id」ですか? – Panagiotis

+0

引用符で囲まれた "id"は、最初の失敗例のファイル名であり、2番目の失敗例の拡張子です。挿入後、列にはリテラル文字列 "id"を含める必要があります。 – bolts

+0

(ファイル名が "filename.id"で、拡張子が "id"のような)where句に入れてはいけませんか? – Panagiotis

答えて

1

まあ...それはルーキーミスでした。これは、一重引用符を使用して文字列リテラルを指定すると機能します。

INSERT INTO files (hash_id, source_id, filename, extension) 
SELECT hashes.id, sources.id, "id", "" 
FROM hashes, sources 
WHERE hashes.hash = "abcd" AND sources.source = "mysource"; 

INSERT INTO files (hash_id, source_id, filename, extension) 
SELECT hashes.id, sources.id, 'filename.id', 'id' 
FROM hashes, sources 
WHERE hashes.hash = "abcd" AND sources.source = "mysource"; 
関連する問題