Мой SQL db имеет 2 таблицы, uidmap
и gidmap
, каждая из которых имеет 2 столбца (UID
, SID
) и (GID
, SID
) соответственно
Обе таблицы на данный момент имеют одну запись:
GID|SID
30000000|S-1-22-2
UID|SID
30000000|S-1-22-2
Здесь UID / GID - это первичный ключ, а SID также имеет ограничение UNIQUE.
Мне нужно добавить запись в таблицы, но сначала нужно проверить, существует ли такая запись.
Проблема у меня в том, что в цикле for
мне нужно сделать SELECT
из таблицы, где UID=<some-value>
или GID=<some-value>
Один из способов сделать это - сначала сопоставить, к какой таблице мы запрашиваем, а затем сопоставить UID или GID.
Есть ли способ напрямую сопоставить значения COLUMN вместо имен?
Что-то типа:
для таблицы в ТАБЛИЦАХ:
SELECT * FROM table WHERE '%ID'=<some-value> and SID=<some-value>
Также есть один дополнительный запрос, сыворотка сделать следующее не удается:
SELECT * from gidmap where UID=<some-value>
Error: no such column: UID
В то время как "" вокруг UID подавляет ошибку отсутствия такого столбца:
SELECT * from gidmap where "UID"=30000000
Нет, это те же ценности, что и сейчас. Но тоже могло быть иначе
Тогда какой смысл в таком запросе? Покажите несколько примеров данных и желаемый результат.
Я обновил вопрос образцами данных и более точной постановкой проблемы
Я также разместил вопрос в конце, почему "" вокруг UID подавляет ошибку?
Это был бы второй, самостоятельный вопрос.
Один из способов упростить эту проблему - использовать опровергать. С его помощью вам не нужно проверять, вставляете ли вы что-то, что уже существует, поскольку эта функция просто обновит его (или сделает что-то безобидное). Хотя это может быть не самый эффективный подход, он устраняет проблему необходимости проверять, существуют ли уже данные перед их вставкой.
В моей версии sqlite нет upsert, sqlite3 --version 3.9.2 2015-11-02
Что вы имеете в виду под «неэффективным»? Как любой другой поиск может быть более эффективным?
@CL. Я имею ввиду в отличие от простой вставки. Более того, обновление с использованием тех же данных, которые уже есть в базе данных, было бы неэффективным процессом.
@mittal upsert доступен начиная с версии 3.24.0. Ваша версия 3.9 несколько устарела, выпущена в 2015 году, я бы подумал о ее обновлении.
@gregory Даже INSERT с ограничениями UNIQUE должен будет проверять старые значения. И УПСЕРТ тоже НИЧЕГО НЕ МОЖЕТ ДЕЛАТЬ.
@gregory Не могу обновить пакет. Это часть огромного индивидуального образа.
@CL, после того, как Грегори предложил UPSERT, я начал изучать INSERT ... VALUE ... ON ... DO NOTHING. Но потом понял, что моя версия sqlite3 устарела и не поддерживает UPSERT
Нет ли возможности ссылаться на столбцы по их значениям, а не по именам?
@mittal Вы настраивали его самостоятельно (в этом случае вы можете настроить его снова), или вы платите кому-то еще за поддержку (в этом случае, за что вы платите?)?
@mittal это немного глупо, но вы можете повернуть таблицу (используя case stmts), чтобы строки стали столбцами, а затем ссылаться на переименованные строки как на столбцы.
В этом случае невозможно сослаться на значение столбца без упоминания имени столбца.
В любом случае, чтобы предотвратить ошибки, когда вы снова пытаетесь вставить те же значения, и если вам не нужно обновлять какие-либо старые строки, вы можете просто использовать ВСТАВИТЬ ИЛИ ПРОЙТИ.
Спасибо, я пойду с INSERT..OR..IGNORE
У UID и GID разные значения?