Sqlite отклоняет кавычки как неоднозначное имя столбца - PullRequest
0 голосов
/ 02 апреля 2012

Я использую Sqlite 3.7.11 с Windows x64 Visual Studio 2010. Приведенный ниже пример можно запустить из инструмента 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

Нужно ли как-нибудь экранировать указанное в кавычках значение?

1 Ответ

2 голосов
/ 03 апреля 2012

Ну ... это была ошибка новичка.Это работает, как только я использовал одинарные кавычки для обозначения строковых литералов:

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...