2017-01-06 3 views
-1

Я переключаюсь с MongoDB на PostgreSQL и задавался вопросом, как я могу реализовать ту же концепцию, что и в MongoDB, для уникальной идентификации каждого сырья MongoId.POSTGRESQL: автоинкремент для поля типа varchar

После миграции уже существующие уникальные поля в нашей базе данных сохраняются как символ. Я ищу минимальные изменения исходного кода.

Итак, если какой-либо способ существует в postgresql для генерации автоматического приращения уникального идентификатора для каждой вставки в таблицу.

+0

К * Mongoid * вы имеете в виду [ObjectId] (https://docs.mongodb.com/manual/reference/method/ObjectId/) типа в MongoDB? (Некоторые API используют для этого имя MongoId, но, пожалуйста, укажите явно). Если это так, находятся ли они в шестнадцатеричном формате после миграции? – pozs

+0

Да, в формате Hex. – CelinVeronicca

+1

Наиболее близким к тому, что в PostgreSQL является ['uuid' type] (https://www.postgresql.org/docs/current/static/datatype-uuid.html). Обратите внимание, что «ObjectId» MongoDB имеет только 12 байт, тогда как UUID имеют 128 бит (16 байт). Но вы можете преобразовать ваши существующие идентификаторы, добавив (или добавив) f.ex. '' 00000000'' им. Вы можете сгенерировать различные UUID (для значений по умолчанию для столбца) с модулем ['uuid-ossp'] (https://www.postgresql.org/docs/current/static/uuid-ossp.html) – pozs

ответ

1

Ближайшая вещь к MongoDB's ObjectId в PostgreSQL - это uuid type. Обратите внимание, что ObjectId имеет только 12 байт, тогда как UUID имеют 128 бит (16 байт).

Вы можете преобразовать ваши существующие идентификаторы, добавив (или добавить) f.ex. '00000000' им.

alter table some_table 
    alter id_column 
    type uuid 
    using (id_column || '00000000')::uuid; 

Хотя было бы лучше, если вы можете это сделать при переносе данных схемы +. Если вы не можете сделать это во время миграции, вам необходимо обновить идентификаторы (в то время как они все еще находятся varchar s: таким образом ссылочные столбцы будут распространять изменение), отбрасывать внешние ключи, делать alter type, а затем повторно применять внешние ключи ,

Вы можете сгенерировать различные UUID (для значений по умолчанию для столбца) с помощью uuid-ossp module.

create extension "uuid-ossp"; 

alter table some_table 
    alter id_column 
    set default uuid_generate_v4(); 
0

Используйте последовательность по умолчанию для столбца:

create sequence some_id_sequence 
    start with 100000 
    owned by some_table.id_column; 

start with должно быть больше, тогда текущего максимального числа.

Затем используйте эту последовательность по умолчанию для вашей колонки:

alter table some_table 
    alter id_column set default nextval('some_id_sequence')::text; 

Лучшее решение было бы изменить столбец целочисленного столбца. Хранение номеров в столбце text (или varchar) - очень плохая идея.

+0

Я не могу изменить в varchar, так как это поле является внешним ключом, а также db заполняется данными – CelinVeronicca

+0

@CelinVeronicca: тогда вы должны изменить и другие столбцы. Хранение чисел в 'varchar' - это столбцы _is_ действительно ** плохая ** идея. Он занимает гораздо больше места и медленнее, чем при использовании правильных чисел –

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