Как мне создать уникальный номер счета / счета? - PullRequest
2 голосов
/ 31 июля 2011

Что вы, люди, используете для создания уникальных номеров счетов? Некоторые используют поле Autoinc, другие что-то еще ... Каков будет правильный способ получения номера учетной записи перед выполнением запроса на вставку?

Ответы [ 4 ]

8 голосов
/ 31 июля 2011

Если вы используете базу данных SQL, используйте Генератор. Если вы хотите использовать независимый механизм, вы можете рассмотреть возможность использования GUID.

4 голосов
/ 31 июля 2011

Вы не сказали нам, какую систему баз данных вы используете, но по звуку вы говорите о таблицах Paradox в Delphi. Если это так, столбец autoInc может работать, хотя, если я правильно помню, вы должны быть очень осторожны при перемещении данных с помощью столбцов Paradox autoInc, потому что они восстанавливаются с нуля при перемещении.

Как уже упоминалось, вы можете использовать GUID - sysutils.function CreateGUID (out Guid: TGUID): HResult; - они всегда будут уникальными, но обратная сторона в GUIDS в том, что упорядочение по этим клавишам не будет интуитивно понятным и, вероятно, будет бессмысленным, поэтому вам потребуется какой-то столбец метки времени, чтобы поддерживать порядок вставок, что может быть важно. Кроме того, GUID является довольно длинной символьной строкой и не очень эффективен для использования в качестве учетной записи #, которая предположительно будет первичным или внешним ключом во многих таблицах.

Так что я бы остановился на autoInc, если вы хотите что-то автоматическое, но если вам нужно переместить данные и сохранить исходные ключи, загрузите исходные автоинкены в виде целочисленных столбцов на их новом месте, или вы можете повредить их. вся ваша база данных. (Я полагаю, что есть другие сценарии, которые также приводят к сбросу autoIncs в таблицах Paradox - исследуйте это, если это уместно - уже давно, с тех пор как я использовал Pdox, и это может не быть проблемой с другими базами данных плоских файлов)

Если вы действительно используете сервер базы данных - SQLServer, Oracle, Interbase и т. Д., Они все имеют функции autoInc / indentity или генератора, иногда в сочетании с триггером - это ваш лучший вариант.

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

НТН

2 голосов
/ 31 июля 2011

В зависимости от того, как долго вы хотите число, вы можете пойти с Jamies MD5 преобразования или:

var
  LDateTime: TDateTime;
  LBytes: array[0..7] of Byte absolute LDateTime;
  LAccNo: string;
  Index: Integer;
begin
  LDateTime := Now;
  LAccNo := EmptyStr;
  for Index := 0 to 7 do
    LAccNo := LAccNo + IntToHex( LBytes[ Index ], 2 );
  // now you have a code in LAccNo, use it wisely (:
end;
0 голосов
/ 31 июля 2011

Я использую этот фрагмент PHP для генерации порядкового номера счета:

$account_number = str_replace(array("0","O"),"D",strtoupper(substr(md5(time()),0,7)));

Это создаст семизначную строку varchar, которая не содержит 0 или o (чтобы избежать ошибок в телефоне или их расшифровки)в электронной почте и т. д.) Вы получаете что-то вроде EDB6DA6 или 76337D5 или DB2E624.

...