2013-08-06 4 views
1

У меня есть таблица с первичным ключом с автоматическим инкрементным целым числом. В таблице хранятся данные объектов реального мира.mysql добавить уникальную uuid в существующую таблицу

Теперь я хочу, чтобы в каждой строке был uuid. Я не хочу менять первичный ключ. Но я хочу быть абсолютно уверен, что назначенный uuid не перезаписывается (так что создайте UUID только для вставки, а не для обновления).

Я хочу использовать этот uuid как QR-код, поэтому он должен быть уникальным для запись в качестве первичного ключа.

Любые идеи, как это сделать?

(я использую cakePHP2, так что может быть поведение, как сотворенная метка время. Это также сделано только с оригинальной INSERT)

ответ

2

варианты Сугубо торт

Есть много способов сделать это ...

Наименьший код инвазивной я думаю, можно было бы добавить проверку в beforeSave соответствующей модели, что-то вроде

public function beforeSave() { 
    if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) { 
     // insert 
     $this->data[$this->alias]['uuid'] = $this->createUUID(); 
    } else { 
     // edit 
     // if you don't want to do anything on insert, delete this "else" 
    } 
    return true; 
} 

(этот код был скопирован из here).

Теперь вы не указали подробные сведения о том, что должно быть uuid (целое число, длина, читаемое слово ...). Но давайте предположим, что это простое целое число, если это не так, все изменения нужно сделать здесь. В одной и той же модели, добавить функцию для создания UUID

private function createUUID() { 
    do { 
     $uuid = rand(); //any logic you want to create the uuid, a md5, substring, hash... 
     //check for no repetition 
     $help = $this->find('first', array('conditions'=>array('uuid'=>$uuid))); 
    } while(!empty($help)); 
    return $uuid; 
} 

И таким образом, вы будете иметь уникальный идентификатор UUID, только добавляемые при вставке, без изменения остальной части кода. Это решение, которое мне нравится.

Теперь другим способом сделать это, например, было бы создание функции UUID, которая возвращает значение, и используя его в afterSave (проверьте, была ли это вставка или обновление) и выполните обновление записи с uuid (к тому времени вы будете иметь идентификатор новой созданной записи).

Существует не так много преимуществ в сравнении с другим ... beforeSave. Вы можете установить поле uuid в базе данных как NOT NULL, а если вы используете afterSave, вам нужно сначала вставить запись, а uuid должен быть нулевым для этого.

Без особого подробного описания я рекомендую опцию beforeSave, только потому, что я от uuid NOT NULL.

+0

thx. Это хороший ответ. Еще один шаг: как я могу легко обновить таблицу (т.е. заполнить вновь добавленное поле)? – Jeroen

+3

Вместо 'rand()' вы можете использовать 'String :: uuid()' http://book.cakephp.org/2.0/en/core-utility-libraries/string.html#String::uuid – Costa

+0

@Costa да, конечно, это был просто пример, так как я не знаю ограничений uuid, но отличный момент. @Jeroen вы можете написать функцию [shell function] (http://book.cakephp.org/2.0/en/console-and-shells.html), которая в основном вызывает 'createUUID()' и редактирует каждую запись, которая не имеет uuid. Это также может быть функцией в модели или действии.Если это только один раз, самый простой вариант будет делать, поскольку вы не будете использовать его в другое время (и, вероятно, удалите его после использования). Если это повторяющаяся вещь (например, раз в месяц), рассмотрите сценарий оболочки или действие контроллера. – Nunser

0

Вы можете использовать триггер вставки на столе, чтобы установить UUID с помощью MySQL UUID(). Вы можете использовать триггер до обновления, чтобы предотвратить изменение uuid (т. Е. NEW.uuid = OLD.uuid в триггере).

Смежные вопросы