@vadikrudnov

Как сгенерировать уникальный id в момент массовой вставки в базу данных?

Всем привет!

Как сгенерировать уникальный id в момент массовой вставки в базу данных?

При создании одиночной записи в базу, можно добиться подобного результата добавив в модель подобное:
protected static function boot()
    {
        parent::boot();
        static::creating(function ($elem) {
            $elem->{$elem->getKeyName()} = (string) Str::uuid();
        });
    }
    public function getIncrementing()
    {
        return false;
    }
    public function getKeyType()
    {
        return 'string';
    }

//Выполнив код:
Model::create([...]);

Но это не сработает, если применить Model::insert

Можно конечно создать массив с данными, в которых уже будет присутствовать уникальный uuid, и вставить эти данные методом "Model::insert", но насколько эти данные будут уникальными, если в один и тот же момент будут создаваться несколько массивов одновременно или с задержкой небольшой? Ведь пока первая операция не завершится, в базе нет данных, а значит вторая операция может на создавать уже не уникальные id.
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
1. ну mariadb вроде как поддерживает из коробки функции в default то есть по факту
Schema::table()....

$table->string('uuid')->default(DB::raw('UUID()'));

});
должно сработать.

2. Есть еще один вариант - $elem->{$elem->getKeyName()} = DB::raw('uuid()');

З.Ы. MySQL 8 - тоже поддерживает. MySQL < 8 - нет (можно через триггеры). Postgres - да. Как вы наверное поняли очень блин важно сразу указывать точно что у вас там вертится, а не начинать новый сезон угадайки. ИбО БыВаЮт ВсЯкИе РаЗлиЧия.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
Вставлять в качестве ключа вот это: https://laravel.com/docs/8.x/helpers#method-str-or... Даже при параллельной вставке из разных сеансов не должно конфликтовать (72 рандомных бита на каждую десятитысячную секунды), но можно по идее откатывать и перегенерировать в случае чего.
+ сам ключ почти монотонно возрастающий (при вставке не чаще чем раз в 0.0001 секунды)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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