【问题标题】:Sqlite rejecting quoted value as ambiguous column nameSqlite 拒绝引用值作为不明确的列名
【发布时间】:2012-04-16 08:44:46
【问题描述】:

我在 Windows x64 Visual Studio 2010 中使用 Sqlite 3.7.11。下面的示例可以从 sqlite3.exe 工具运行。我从代码中得到了同样的失败。

鉴于此表:

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”是哪一列?
  • 引用的“id”是第一个失败示例中的文件名和第二个失败示例中的扩展名。该列应在插入后包含文字字符串“id”。
  • 不应该在 where 子句中作为 (filename LIKE "filename.id" AND extension LIKE "id") 吗?
  • 找到了解决方案。我需要在字符串文字周围使用单引号。将上面的所有“实例”更改为“,它按预期工作。sqlite.org/lang_keywords.html

标签: sqlite


【解决方案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";

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 2010-10-08
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多