Как генерировать уникальный идентификатор в MySQL?

Я делаю это при помощи приложенного поведения с 3 свойствами зависимости; каждый - команда для выполнения, каждый - параметр для передачи команде, и другой ключ, который заставит команду выполняться. Вот код:

public static class CreateKeyDownCommandBinding
{
    /// 
    /// Command to execute.
    /// 
    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command",
        typeof(CommandModelBase),
        typeof(CreateKeyDownCommandBinding),
        new PropertyMetadata(new PropertyChangedCallback(OnCommandInvalidated)));

    /// 
    /// Parameter to be passed to the command.
    /// 
    public static readonly DependencyProperty ParameterProperty =
        DependencyProperty.RegisterAttached("Parameter",
        typeof(object),
        typeof(CreateKeyDownCommandBinding),
        new PropertyMetadata(new PropertyChangedCallback(OnParameterInvalidated)));

    /// 
    /// The key to be used as a trigger to execute the command.
    /// 
    public static readonly DependencyProperty KeyProperty =
        DependencyProperty.RegisterAttached("Key",
        typeof(Key),
        typeof(CreateKeyDownCommandBinding));

    /// 
    /// Get the command to execute.
    /// 
    /// 
    /// 
    public static CommandModelBase GetCommand(DependencyObject sender)
    {
        return (CommandModelBase)sender.GetValue(CommandProperty);
    }

    /// 
    /// Set the command to execute.
    /// 
    /// 
    /// 
    public static void SetCommand(DependencyObject sender, CommandModelBase command)
    {
        sender.SetValue(CommandProperty, command);
    }

    /// 
    /// Get the parameter to pass to the command.
    /// 
    /// 
    /// 
    public static object GetParameter(DependencyObject sender)
    {
        return sender.GetValue(ParameterProperty);
    }

    /// 
    /// Set the parameter to pass to the command.
    /// 
    /// 
    /// 
    public static void SetParameter(DependencyObject sender, object parameter)
    {
        sender.SetValue(ParameterProperty, parameter);
    }

    /// 
    /// Get the key to trigger the command.
    /// 
    /// 
    /// 
    public static Key GetKey(DependencyObject sender)
    {
        return (Key)sender.GetValue(KeyProperty);
    }

    /// 
    /// Set the key which triggers the command.
    /// 
    /// 
    /// 
    public static void SetKey(DependencyObject sender, Key key)
    {
        sender.SetValue(KeyProperty, key);
    }

    /// 
    /// When the command property is being set attach a listener for the
    /// key down event.  When the command is being unset (when the
    /// UIElement is unloaded for instance) remove the listener.
    /// 
    /// 
    /// 
    static void OnCommandInvalidated(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
    {
        UIElement element = (UIElement)dependencyObject;
        if (e.OldValue == null && e.NewValue != null)
        {
            element.AddHandler(UIElement.KeyDownEvent,
                new KeyEventHandler(OnKeyDown), true);
        }

        if (e.OldValue != null && e.NewValue == null)
        {
            element.RemoveHandler(UIElement.KeyDownEvent,
                new KeyEventHandler(OnKeyDown));
        }
    }

    /// 
    /// When the parameter property is set update the command binding to
    /// include it.
    /// 
    /// 
    /// 
    static void OnParameterInvalidated(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
    {
        UIElement element = (UIElement)dependencyObject;
        element.CommandBindings.Clear();

        // Setup the binding
        CommandModelBase commandModel = e.NewValue as CommandModelBase;
        if (commandModel != null)
        {
            element.CommandBindings.Add(new CommandBinding(commandModel.Command,
            commandModel.OnExecute, commandModel.OnQueryEnabled));
        }
    }

    /// 
    /// When the trigger key is pressed on the element, check whether
    /// the command should execute and then execute it.
    /// 
    /// 
    /// 
    static void OnKeyDown(object sender, KeyEventArgs e)
    {
        UIElement element = sender as UIElement;
        Key triggerKey = (Key)element.GetValue(KeyProperty);

        if (e.Key != triggerKey)
        {
            return;
        }

        CommandModelBase cmdModel = (CommandModelBase)element.GetValue(CommandProperty);
        object parameter = element.GetValue(ParameterProperty);
        if (cmdModel.CanExecute(parameter))
        {
            cmdModel.Execute(parameter);
        }
        e.Handled = true;
    }
}

Для использования этого от xaml можно сделать что-то вроде этого:


    Enter

Редактирование: CommandModelBase является базовым классом, который я использую для всех команд. Это основано на классе CommandModel от статьи Dan Crevier о MVVM ( здесь ). Вот источник для немного измененной версии, которую я использую с CreateKeyDownCommandBinding:

public abstract class CommandModelBase : ICommand
    {
        RoutedCommand routedCommand_;

        /// 
        /// Expose a command that can be bound to from XAML.
        /// 
        public RoutedCommand Command
        {
            get { return routedCommand_; }
        }

        /// 
        /// Initialise the command.
        /// 
        public CommandModelBase()
        {
            routedCommand_ = new RoutedCommand();
        }

        /// 
        /// Default implementation always allows the command to execute.
        /// 
        /// 
        /// 
        public void OnQueryEnabled(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = CanExecute(e.Parameter);
            e.Handled = true;
        }

        /// 
        /// Subclasses must provide the execution logic.
        /// 
        /// 
        /// 
        public void OnExecute(object sender, ExecutedRoutedEventArgs e)
        {
            Execute(e.Parameter);
        }

        #region ICommand Members

        public virtual bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public abstract void Execute(object parameter);

        #endregion
    }

Комментарии и предложения для улучшений очень приветствовались бы.

30
задан Peter Mortensen 15 February 2010 в 17:21
поделиться

6 ответов

программный способ может быть to:

  • добавить УНИКАЛЬНЫЙ ИНДЕКС в поле
  • генерировать случайную строку в цикле PHP
  • в PHP (while (! DO_THE_INSERT))
    • генерировать другую строку

Примечание:

  • Это может быть грязным, но имеет преимущество быть DBMS-агностиком
  • , даже если вы решите использовать специфичную для СУБД функцию генератора уникальных идентификаторов (UUID, так далее) рекомендуется обеспечить , что поле ИМЕЕТ УНИКАЛЬНОЕ , используя индекс
  • , цикл статистически не выполняется вообще, он вводится только при ошибке вставки
14
ответ дан 27 November 2019 в 23:02
поделиться

Для уникальности я беру временную метку Unix, добавляю к ней случайную строку и использую ее.

1
ответ дан 27 November 2019 в 23:02
поделиться

Below is just for reference of numeric unique random id...

it may help you...

$query=mysql_query("select * from collectors_repair");
$row=mysql_num_rows($query);
$ind=0;
if($row>0)
{
while($rowids=mysql_fetch_array($query))
{
  $already_exists[$ind]=$rowids['collector_repair_reportid'];
}
}
else
{
  $already_exists[0]="nothing";
}
    $break='false';
    while($break=='false'){
      $rand=mt_rand(10000,999999);

      if(array_search($rand,$alredy_exists)===false){
          $break='stop';
      }else{

      }
    }

 echo "random number is : ".$echo;

and you can add char with the code like -> $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;

1
ответ дан 27 November 2019 в 23:02
поделиться

Используйте функцию UUID .

Я не знаю источника ваших процедур на PHP, которые генерируют уникальные значения. Если это библиотечная функция, они должны гарантировать, что ваше значение действительно уникально. Проверьте документацию. Вы должны, однако, использовать эту функцию постоянно. Если вы, например, используете функцию PHP для генерации уникального значения, а затем решите использовать функцию MySQL, вы можете сгенерировать значение, которое уже существует. В этом случае также неплохо было бы указать УНИКАЛЬНЫЙ ИНДЕКС в столбце.

3
ответ дан 27 November 2019 в 23:02
поделиться

Я использую UUID () для создания уникального значения.

пример:

insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");
55
ответ дан 27 November 2019 в 23:02
поделиться

Вы также можете рассмотреть возможность использования crypt () * для генерации [почти гарантированного] уникального идентификатора внутри ваших ограничений.

0
ответ дан 27 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: