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
が、私はさらに何とか引用された値をエスケープする必要がありますか?
最後の "id"はどこに属していますか?つまり、どの列が「id」ですか? – Panagiotis
引用符で囲まれた "id"は、最初の失敗例のファイル名であり、2番目の失敗例の拡張子です。挿入後、列にはリテラル文字列 "id"を含める必要があります。 – bolts
(ファイル名が "filename.id"で、拡張子が "id"のような)where句に入れてはいけませんか? – Panagiotis