Как проверить наличие записи в таблице sql
Перейти к содержимому

Как проверить наличие записи в таблице sql

  • автор:

Как проверить существование записи?

Добрый день! Возник вопрос, как проверить существование записей передавая id записей в IN.

Таблица cities (содержится информация, о городе)
Таблица сountry (информация, о стране).
Таблица Т3 в которой есть маппинг между сountry и cities.

В таблице cities есть 2 записи
id: 1, name: Москва
id: 2, name: Пенза

В таблице сountry есть 1 запись
id: 1, name: Россия

В таблице T3 есть 1 запись
id:1, id_city:1, id_сountry:1

Я думал можно сделать так

select exists(select * from T3 where id_сountry=1 AND id_city IN (1, 2));

НО он найдет id_city 1 и скажет try, а нужно решение чтобы он вернул false, потому что в T3 нет id_city = 2.

Подскажите пожалуйста решение или напутствие.

  • Вопрос задан более двух лет назад
  • 2110 просмотров

Форум пользователей MySQL

проверять результат mysql_num_rows, но как то некрасиво выглядит, да и иногда нужно вставить подобную конструкцию в виде вложенного подзапроса.

-add: Можно попробовать использовать оператор EXISTS, но опять же неизвестно, будет ли подзапрос выполнен полностью или достаточно нахождения первой записи.

Ещё вопросы по запросу:

Код:
SELECT * FROM tbl WHERE `n1`!=ALL(SELECT `n2` FROM tbl WHERE (условие))

1. Подзапрос будет выполняться для каждого ряда внешнего запроса или только 1 раз?
2. Проверка условия `n`!=ALL остановится после нахождения перого же равества значений или будет просмотрена вся выборка подзапроса?

Отредактированно coin (14.02.2009 20:15:39)

Проверка наличия записи в БД при выполнении запроса

Есть программа в которой происходит добавление данных в базу SQL. Необходимо реализовать функцию проверки наличия записи при нажатии кнопки «Сохранить», если запись есть должен выполняться запрос Update, в ином случае выполняется запрос Insert. Как это реализовать?

We recommend hosting TIMEWEB

We recommend hosting TIMEWEB

Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Subscribe to the discussion 2
Section subscription 234

Do you like it? Share on social networks!

Evgenii Legotckoi

  • Evgenii Legotckoi
  • #
  • May 16, 2017, 6:35 a.m.

Можно через QSqlQuery и логический оператор EXISTS сделать.

QSqlQuery query; // Проверка наличия записей по дате QString str = QString("SELECT EXISTS (SELECT * FROM TableExample WHERE Date = '%1');").arg("2017-08-03"); query.prepare(str); query.exec(); query.next(); /* Если запись существует, то вызывается * информационное сообщение * */ if(query.value(0) != 0) < QMessageBox::information(this, trUtf8("Error"), trUtf8("Record is exists")); >else < // ToDo something >
  • MadBear541
  • #
  • May 16, 2017, 12:02 p.m.

Вопрос: есть способ обновить модель QSqlQeuryModel?

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 16, 2017, 4:09 p.m.

Выполнить заново setQuery() с последней применённой QSqlQuery, с помощью метода query()

model->setQuery(model->query());
  • MadBear541
  • #
  • May 17, 2017, 3:14 a.m.

если использовать model->setQuery(model->query().lastQuery()); ? я так понял что в данном случае он вызывает последний запрос

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 17, 2017, 6:04 a.m.

QSqlQuery всегда содержит только последний запрос, а lastQuery() возвращает этот запрос в виде строки QString, так что, если база данных используется одна, то разницы нет, в каком виде будет передаваться запрос в model->setQuery()

  • MadBear541
  • #
  • May 17, 2017, 11:29 a.m.

столкнулся с проблемой. приходиться на кнопку дважды нажимать чтоб выполнялся запуск кода приведенного вами. вызов произвожу через connect к данному слоту

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 17, 2017, 11:56 a.m.

Проблема в том, как вы применили код, который я вам привёл, а не в самом коде.

  • MadBear541
  • #
  • May 17, 2017, 11:59 a.m.

проблема как я выяснил в том что connect соединение с слотом с первого нажатия не производит. а подключается к слоту только со второго нажатия и запускает нормально слот. connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(tww())); вот так соединяю нажатие и слот

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 17, 2017, 12:04 p.m.

Вы запихали connect не в то место в коде. Написали некачественный алгоритм, по которому коннект создаётся не в нужное время.

  • MadBear541
  • #
  • May 18, 2017, 1:55 p.m.

Еще вопрос, с которым не могу разобраться. Есть ComboBox — raspsel, который позволяет выбрать поле из таблицы. Делаю я это следующим образом:

rasmd = new QSqlQueryModel(this); QSqlQuery zrs; zrs.exec("SELECT idr, CONCAT(rnumber, ' от ', rdata) FROM op"); rasmd->setQuery(zrs); ui->raspsel->setModel(rasmd); ui->raspsel->setModelColumn(1);

Теперь вопрос. Как сделать чтобы открыв форму для редактирования я видел выбранное значение и при этом мог поменять значение. через QDataWidgetMapper не получается правильно сделать. Не допонимаю как работает ComboBox

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 18, 2017, 1:59 p.m.

Начнём с того, что QSqlQueryModel является моделью только для чтения, она не может быть редактируемой. А также, ответьте на вопрос. Зачем Вы выполняете метод exec() у QSqlQuery? Когда потом помещаете этот QSqlQuery в модель QSqlQueryModel? Обращение к базе данных происходит дважды.

  • MadBear541
  • #
  • May 18, 2017, 2:04 p.m.

я так делаю потому что потом планирую сделать библиотеку sql запросов, потом исправлю, сейчас занимаюсь отладкой. Редактируемая же форма QSqlTableModel и QSqlRelationalTableModel. QSqlQueryModel я использую для извлечения данных из одной таблицы.

Evgenii Legotckoi

  • Evgenii Legotckoi → MadBear541
  • #
  • May 18, 2017, 2:13 p.m.

Ну тогда у QComboBox есть методы currentData(), currentText(), currentIndex() с помощью которых можно забрать текущее значение. Передать его в сторону формы редактирования и с помощью этого значения выбрать нужную строку из таблицы базы данных, чтобы отобразить её в форме для редактирования.

  • MadBear541
  • #
  • May 21, 2017, 3:11 p.m.

Опишу еще раз ситуацию. Есть таблица в которую посредством SQL запроса ложу данные, так как там необходимо в один столбец выводить несколько значений. Теперь встала проблема что при двойном клике по строке и вызове окна для редактирования программа ложится по сигналу полученному от операционки. я реализовал метод с использованием currentIndex()

edob = new editobject(ui->obv->selectionModel()->currentIndex().row());

edob экземляр формы для редактирования editobject, а obv таблица. при отладке выяснил что как только отрабатывает строка rmap->setCurrentModelIndex(rmod->index(row,0)); в форме редактирования, прилетает сигнал от операционной системы rmap = new QDataWidgetMappe как решить проблему. от QComboBox я на данном этапе отказался. у меня сама форма не отрабатывает

Как проверить наличие записи с через SQL запрос

Вопрос с SQL запросом. Необходимо проверить есть ли в таблице Data запись с фамилией «Иванов Иван», если есть, то ничего не делать, если нет то добавить новую запись.

Кое-что набросал, но как обработать найдена запись или нет не догоняю..

Edit1.text:='Иванов Иван'; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT *'); ADOQuery1.SQL.Add('FROM Data'); ADOQuery1.SQL.add('WHERE Name like ''' +'%'+Edit1.Text + '%'''); ADOQuery1.ExecSQL;

__________________
Delphicode.org — справочник Delphi

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *