На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Сгенерировать уникальный ID , Paradox, BDE
    Только начал разбираться как работать с БД, так сразу наткнулся на вопрос, который поставил меня в тупик.
    В общем есть несколько таблиц, причем в каждой таблице есть поле "ID" (число). Нужно создать новую запись в одной из таблиц, и полю "ID" присвоить уникальное значение.

    Вопрос, как сгенерировать такое уникальное значение?

    Заранее спасибо за ответ.
      CreateGuid ?
        Если приходится генерировать его врукопашную (сама база НЕ умеет ето делать, например, с помощью AUTOINCREMENT-поля) может подойти что-то вроде:

        MS SQL:
        Declare
           @NewID int
        select @NewID=isnull(max(ID), 0)+1 from mytable

        insert into mytable(ID, ....) values (@NewID, ....)


        При етом желательно SET TRANSACTION ISOLATION LEVEL SERIALISABLE

        И, если eсли уж генерить етот ID руками, лучше сразу предусмотреть возможность создания уникальных ID в нескольких экземплярах базы (мало ли, понадобится распределенную ИС создавать), т.е., чтоб ID состоял из двух частей -- кода экземпляра БД и, например, сквозного номера в пределах етого екземпляра, вроде етого:

        Declare
           @NewID int
        select @NewID=isnull(max(ID), @Code*1000000)+1 from mytable where ID between @Code* 1000000 and @Code* 1000000 + 999999

        insert into mytable(ID, ....) values (@NewID, ....)

          Спасибо, вроде все понятно.
          Только интересно стало, не случится ли когда-нибудь в этой строчке @NewID=isnull(max(ID), 0)+1 ошибка переполнения?
            Обязательно случится. Когда нибудь. Переполнение у любого типа случиться может, даже у 128-битного GUID smile.gif

            Надо просто диапазон выбирать с запасом порядка на два...
              И сразу еще вопрос.
              Вот сгенерировали мы ID, создали новую запись. а как наибыстрейшим способом получить из моей программы этот ID?
                ???

                Ну вот пример хранимой процедуры, которая делает и то и другое и третье:

                MS SQL
                CREATE PROCEDURE sp_AddAndFetchNewRecord
                    @ServerCode int,
                    @Name varchar(50),
                    @Description varchar(200)
                AS

                Declare
                    @NewID int

                BEGIN TRANSACTION

                select
                    @NewID = isnull(max(ID), @ServerCode*100000)+1
                from
                    tb_Records
                where
                    [ID] between @ServerCode*100000 and (@ServerCode+1)*100000 - 1

                insert into
                    tb_Records([ID], [Name], [Description])
                values
                    (@NewID, @Name, @Description)

                COMMIT TRANSACTION

                select
                    *
                from
                    tb_Records
                where
                    [ID] = @NewID
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0287 ]   [ 16 queries used ]   [ Generated: 15.05.24, 05:17 GMT ]