Как избежать дублирования идентификаторов в базе данных - PullRequest
1 голос
/ 14 октября 2010

ВНИМАНИЕ: Оцените все ответы, спасибо, но у нас уже есть последовательность ... и мы не можем использовать УНИКАЛЬНЫЕ ограничения, потому что некоторые элементы должны иметь дубликаты. Мне нужно как-то обрабатывать это с помощью PLSQL, поэтому на основе некоторых критериев(используя оператор if) мне нужно убедиться, что для этого нет дубликатов .. И просто для подтверждения, эти идентификаторы очень настраиваются с разными типами строк. И для каждого набора строк у нас есть только число, которое подсчитываетсядля этой строки (STR-STR - ####), и у нас есть, как сотни этих комбинаций STR-STR, и для каждой комбинации у нас есть ####, который считает ... И поверх этих некоторых STR-STRкомбинации могут иметь дубликаты. Таким образом, мы НЕ МОЖЕМ использовать УНИКАЛЬНЫЕ ОГРАНИЧЕНИЯ, не можем использовать ПЕРВИЧНЫЙ КЛЮЧ, так как это не простое число, и помимо этого у нас есть ПЕРВИЧНЫЙ КЛЮЧ, назначенный каждому элементу. Эти идентификаторыдля пользователей, а не для управления базой данных.

Когда пользователь создает элемент на основе какого-либо материала, мы присваиваем элементу определенное число. В функции сохранения вызывается функция для подготовки первой исходной строки, а затем таблицы, в которой находятся числа.хранится, сканируется и присваивается следующее доступное 4-значное число для этой конкретной строки.

Теперь с этим есть некоторые проблемы, между получением следующего номера и фиксацией в базе данных существует около 1000 строк кодов.,Проблема заключается в том, что когда 2 человека создают элемент с одинаковыми критериями в течение нескольких секунд, иногда выдается одно и то же число.

Что я сделал, так это то, что перед фиксацией я проверял базу данных на наличиеномер и, если он существует, я вызываю функцию, чтобы снова получить следующий доступный номер ...

Несмотря на то, что этот код уменьшил шансы на дублирование, если я сохраню 2 элемента одновременно, я все равно сохранюполучить дубликат числа ..

Кто-нибудь знает любой способ избежать дубликатов и снизить шансы дубликата числа до 0?

РЕДАКТИРОВАТЬ1: у нас уже есть первичный ключ .. Этот идентификаторспециальная строка, и очень настраиваемая, поэтому нельзя просто использовать число, которое считается от 0

РЕДАКТИРОВАТЬ2: Есть также некоторые случаи, когда нам нужны дубликаты ... это очень незначительно (может быть,около 10 различных треков предметов используют дубликаты), поэтому перед тем, как я проверю дубликаты, перед коммитом с инструкцией if, так что если элемент сохраняетсяЗатем на одной из систем, которая должна иметь дубликаты, я пропускаю проверку ...

РЕДАКТИРОВАТЬ 3: Мы используем PL / SQL здесь

РЕДАКТИРОВАТЬ 4: Я думаю, эта проблемабыл очень конкретным, и я не совсем выразил это так. Хотя было много ответов, никто из них действительно не охватил мою проблему .. Несмотря на это, я решил проблему и добавил ниже как мой ответ ..

Ответы [ 13 ]

0 голосов
/ 14 октября 2010

Вы можете добавить таблицу для хранения всех идентификаторов, которые были использованы и должны быть уникальными, например:

create table unique_identifiers (id varchar2(12) primary key);

Затем, когда в вашей логике на 350 строк вы генерируете 'STR-STR =#### 'значение, которое должно быть уникальным, вставьте его в эту таблицу.Если вставка не удалась, найдите другой номер и попробуйте снова.

0 голосов
/ 14 октября 2010

Ваш код обязательно должен быть заменен на ПОСЛЕДОВАТЕЛЬНОСТЬ.Oracle очень хорошо управляет этим параллелизмом.

Кроме того, эта последовательность должна быть сохранена в столбце с ограничением UNIQUE.

0 голосов
/ 14 октября 2010

Создайте столбец PRIMARY KEY или UNIQUE KEY, который автоматически увеличивается (либо с помощью ключевого слова AUTOINCREMENT, либо с помощью SEQUENCE (как это делает Oracle)).Таким образом, если 2 человека добавляют 2 строки точных данных в одно и то же время, база данных добавит 2 точных значения, но каждое со своим уникальным идентификатором.

...