[решено] Отсутствует ID, SQLQuery как сохранять?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 23.02.2016 20:53:41

Всем привет,
если в запросе выводится ID, то SQLQuery.ApplyUpdates всё сохраняет и всё работает.

Но вот ведь, есть ещё MySQL таблицы и они: без ID (auto_increment).
Суть: :?: Как в таких сохранять изменения?

Или например, если есть таблица с ID, но когда делаю SQLQuery выборку, например: SELECT `description` WHERE 1, то
соответственно ID не выводится в гриде, но есть, где-то там в базе. В таких случаях, "лазарус SQLQuery"
вообще выдаёт мессадьж на англицком: мол всё хреново нужно делать: SELECT c ID.
Это требование "лазарус SQLQuery" более менее понятно, но как его обойти?
Как в таких таблицах сохранять изменения?
Как phpMyAdmin в таких таблицах(у которых нет ID) сохраняет изменения?

Спасите-помогите: пожалуйста :oops: :cry:


.
Последний раз редактировалось vitaly_l 24.02.2016 22:53:15, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 23.02.2016 23:06:08

Объясните мне, тупому, как вы собираетесь вообще сохранять непонятно что - неизвестную запись? Откуда серверу догадаться, куда сохранять?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 23.02.2016 23:24:15

Снег Север писал(а):Объясните мне, тупому

Да я-то могу сохранить - это не проблема ( можно добавить авто-инкремент перед запросом ). Но это сложно для самой базы данных.
Поэтому, мне хочется понять как умные и мудрые программисты это делают, а то потом опять выяснится что, я всё делал не так.
phpMyAdmin - это же ведь делает как-то и явно не моим способом.

Вопрос в силе:
без ID (auto_increment).
Как сохранять изменения?
Или точнее: Как это делают?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 08:50:41

Сохраняют выполнением запроса вида:
update tab1 set name="Vasia" where family="Pupkin"

Если у вас в запросе есть уникальный индекс, то лазарус может автоматически сформировать запрос на сохранение изменений. Если же такого нет, то программист должен писать такой запрос сам. По-моему, более чем очевидно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vada » 24.02.2016 11:15:11

vitaly_l Мудрые программы называются "Тригеры". Если у Вас в таблице автоинкрементное поле, то для него пишется тригер, которые занимается тем что создает этот ID для новой записи. С MySQL я никогда не работал, а вот в PostgreSQL если поле объявлено автоинкрементным, то тригер формируется автоматически. Создается переменная в которой хранится текущее значение ID и тригер который с этой переменной работает.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 11:21:06

vada писал(а):Мудрые программы называются "Тригеры". Если у Вас в таблице автоинкрементное поле, то для него пишется тригер, которые занимается тем что создает этот ID для новой записи. ... тригер формируется автоматически. Создается переменная в которой хранится текущее значение ID и тригер который с этой переменной работает.

Ага. тригеры. посмотрю в поиске.

А как такой тригер создать для "SQLQuery.ApplyUpdates", если ОТСУТСТВУЕТ уникальный автоинкрементный ID ?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 12:06:46

В MySQL для автоинкрементного поля триггер не нужен. В команде insert просто опускается имя такого поля и оно получает новое значение автоматически.
Можно создавать встроенные процедуры и перекладывать на них рутинные операции.

И крайне не рекомендую пользоваться ApplyUpdates. Или использовать Edit и Post, или писать запросы на insert / update самому.

Добавлено спустя 36 секунд:
vitaly_l писал(а):А как такой тригер создать для "SQLQuery.ApplyUpdates", если ОТСУТСТВУЕТ уникальный автоинкрементный ID ?

Никак.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 12:42:03

Снег Север писал(а):И крайне не рекомендую пользоваться ApplyUpdates. Или использовать Edit и Post, или писать запросы на insert / update самому.

У меня включен autocoomit; И что плохого в том что я буду делать свои запросы? Чем это грозит базе?
Снег Север писал(а):vitaly_l писал(а):
А как такой тригер создать для "SQLQuery.ApplyUpdates", если ОТСУТСТВУЕТ уникальный автоинкрементный ID ?

Никак.

Как это "НИКАК" если даже phpMyAdmin - это делает?
Как phpMyAdmin - это делает?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 13:51:22

vitaly_l писал(а):У меня включен autocoomit; И что плохого в том что я буду делать свои запросы? Чем это грозит базе?
Снег Север писал(а):
Базе ничем не грозит, просто вы получаете проблемы типа той, что написали.
vitaly_l писал(а):Как это "НИКАК" если даже phpMyAdmin - это делает?

Я понятия не имею, что и как он делает, но предполагаю, что он строит условие обновления по всем остальным полям или подобное. Можете написать такое и вы, если склонны к "сексу в гамаке".
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 14:14:48

Снег Север писал(а):Базе ничем не грозит, просто вы получаете проблемы типа той, что написали.

Нет, эта проблема возникает без написания своих запросов к базе. И Vada был прав это регулируется какими-то триггерами.
https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80_(%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)

Поэтому повторю вопрос:

А как такой триггер создать, для вот этой иерархии объектов: SQLQuery, DataSource, MySQL56Connection, SQLTransaction, DBGrid, если -
мне нужно обновить какую-то там запись в базе на сервере, когда ОТСУТСТВУЕТ уникальный автоинкрементный индекс типа ID ?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 15:33:33

Триггеры к вашей проблеме никакого отношения не имеют. Можете почитать про них тут, например:
https://habrahabr.ru/post/37693/
Триггеры используют, когда при вставке/обновлении нужны дополнительные проверки или действия. Уникальный индекс триггер вам не создаст, если нет в таблице такого поля.

Я вам уже писал - если нет ID, строят свое условие для поиска обновляемых записей, что вам непонятно? Я с MySQL восемь лет постоянно работаю.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 15:43:42

Да Вы правы, я прочитал про триггеры, это удобно но - это не то.

Снег Север писал(а):строят свое условие для поиска обновляемых записей

Если id есть, то lazarus обновляет и всё нормально работает, а если id нет, то всегда нужно свой собственный SQL запрос к базе делать?
Правильно? Альтернативы нет? Точно? Уверены?
Странно, даже phpMyAdmin - это делает, значит и lazarus должен мочь.
Почему же lazarus-то, не обновляет при изменении в DBGrid?
Если кто знает альтернативу - откликнитесь прлиииииз. :cry:
спасибо.

.
Последний раз редактировалось vitaly_l 24.02.2016 15:53:03, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение Снег Север » 24.02.2016 15:52:39

Уверен.
Лазарус вам ничего не должен. И никто вам не мешает добавить функциональность phpMyAdmin - у него код, насколько я знаю открытый. Просто никому такое не нужно в прикладных программах.
Но есть HeidiSQL, с открытым кодом, на Делфи, для администрирования MySQL - можете там поискать полезное для вашей задачи.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение resident » 24.02.2016 17:13:31

vitaly_l
http://wiki.freepascal.org/Working_With_TSQLQuery
Секции
Updating data
TSQLQuery.InsertSQL, TSQLQuery.UpdateSQL and TSQLQuery.DeleteSQL: Basic Use of Parameters

Снег Север писал(а):И крайне не рекомендую пользоваться ApplyUpdates. Или использовать Edit и Post

Как это не использовать? А что ж делать?
По той же ссылке
If you do not call ApplyUpdates, the database will not be updated with the local changes.

Я вот и Post и ApplyUpdates пишу
Код: Выделить всё
                if qrTableB.Modified then
                  begin
                    qrTableB.Post;
                    qrTableB.ApplyUpdates;
                  end;

Это неправильно?
Этот код подобен как в статье здесь на сайте:
http://www.freepascal.ru/article/lazaru ... 416150500/
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Отсутствует ID как SQLQuery.ApplyUpdates как сохранять?

Сообщение vitaly_l » 24.02.2016 17:32:37

resident писал(а):Как это не использовать? А что ж делать?

Не слушайте, смело используйте - всё прекрасно работает. Можете ещё настроить autocommit;

resident писал(а):Секции
Updating data

Да, всё правильно, я это читал. И именно про "это" - этот топик. Там, если я правильно перевёл, предлагается при отсутствии авто-индекса его сделать и только потом делать запрос к базе, если нужно её обрабатывать. И очевидно в конце работы, нужно удалить столбец с автоинкрементным индексом.
Код: Выделить всё
ALTER TABLE testrig
ADD COLUMN autoid INT
PRIMARY KEY AUTO_INCREMENT;

Так вот мне этот подход не нравится, т.к. тогда проще изначально сделать таблицу с ненужным мне PRIMARY KEY AUTO_INCREMENT;
Пресловутый phpMyAdmin, как-то обходится без PRIMARY KEY AUTO_INCREMENT и при внесении изменений он всё сохраняет в нужную строку базы.
А вот Лазарус ругается, при отсутствии PRIMARY KEY AUTO_INCREMENT.

И я наивно подумал, что в Лазарусе есть какой-то секрет, который позволяет обрабатывать такие таблицы.
Но пока, секрет мной не выведан. Или такой возможности действительно нет, как утверждает обкуренный Север Снег.
В общем изначальный вопрос в силе.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 236

Рейтинг@Mail.ru