Можно ли использовать tfdquery.aggregates в качестве автоидентификатора

В Delphi компонент TFDQuery имеет свойство "агрегаты", которое представляет облегченную версию агрегированных полей на стороне клиента для наборов данных.

Если вы вставите «MAX (ID)», вы получите число, которое на единицу меньше, чем следующее свободное число ID.

Если бы это можно было использовать для вычисления ID-Field, было бы очень просто иметь автогенератор для ID-Field для каждого типа базы данных.

Но я сомневаюсь, потому что это называется «клиентская сторона». Я не знаю точно, что это значит. Разве он не вычисляет агрегат для всей таблицы, а только для локального раздела записей? В последнем случае его можно было бы использовать для автогенератора после его правильной инициализации.


person user1473001    schedule 28.07.2018    source источник
comment
Я не знаю, что вам нужно, но я бы порекомендовал вам прочитать Автоинкрементные поля.   -  person Victoria    schedule 28.07.2018
comment
Я знаю эту страницу. В зависимости от СУБД автоматически увеличивающиеся поля могут быть реализованы либо с использованием специального типа данных столбца IDENTITY (или аналогичного), либо с использованием генератора (или последовательности) и триггера таблицы: альтернативы мне. Единое решение было бы лучше.   -  person user1473001    schedule 28.07.2018
comment
Делать то, что там описано, это безопасный способ. Если вы вставляете значение идентификатора только на основе MAX(ID) + 1, вы не можете гарантировать, что другой пользователь вставит то же самое.   -  person Victoria    schedule 28.07.2018
comment
Кроме того, существует единый способ создания таблицы с автоинкрементным столбцом идентификации. Тем не менее, не ясно, что вы хотите сделать. Если вы конкретизируете свою цель, вы можете получить правильный ответ.   -  person Victoria    schedule 28.07.2018


Ответы (1)


Если бы это можно было использовать для вычисления ID-Field, было бы очень просто иметь автогенератор для ID-Field для каждого типа базы данных.

Боюсь, что нет, во всяком случае, не для "всякой базы данных". Значение «клиентской стороны» заключается в том, что клиентский метод получения идентификатора строки не годится для общей базы данных, где разные пользователи могут пытаться одновременно добавлять строки в одну и ту же таблицу.

Для многопользовательской базы данных, как всегда, лучше всего использовать любые средства, предоставляемые серверной RDMS для предоставления значений полей идентификаторов. В некоторых RDMS, таких как Interbase, есть так называемые генераторы, которые надежно делают это за вас.

person MartynA    schedule 28.07.2018
comment
Вот чего я боялся. Спасибо за четкий ответ. И да, я тоже думаю, что нет общего решения этой проблемы, но у каждой RDMS свой путь. Это была только надежда. - person user1473001; 28.07.2018
comment
Существует унифицированный способ создания команды CREATE для автоинкрементных столбцов идентификаторов, если это то, что вы хотите получить (FireDAC может их обнаружить, так что еще может быть целью). Сложно сказать. Это ответ на то, что вы спросили. - person Victoria; 28.07.2018
comment
Спасибо, Виктория, за очень полезные ответы. Я очень редко использую Stackoverflow для вопросов. Я не знаю, как я могу поблагодарить вас. Но я пока не хочу платить за кофе. Я более подробно рассмотрю столбцы идентичности и возможности обобщения. Я использую только небольшие базы данных для приложений и мобильных устройств. Я видел, что вы также интересуетесь SQLite. Это очень хорошо работает с Delphi. Я перейду на Interbase ToGo. Но есть много других систем БД, с которыми может работать Delphi, поэтому я ищу обобщение даже для многопользовательских БД. - person user1473001; 28.07.2018
comment
Пожалуйста! Но я не привязан к SQLite (для СУБД я предпочитаю PostgreSQL). Меня интересует FireDAC в целом. И я знаю, что в FireDAC есть способ определить таблицу и сгенерировать команду SQL для ее создания. Или на самом деле создать его. Если вам было интересно, как, задайте другой вопрос, и я (или кто-то другой) могу показать вам, как ;-) - person Victoria; 28.07.2018