Значение автоинкремента изменяется, когда в SQL Server 2014 произошла ошибка базы данных - PullRequest
1 голос
/ 03 июля 2019

enter image description here Contract_id - это первичный ключ и его автоинкрементное значение

Я использую SQL Server 2014 и codeigniter при добавлении данных в базу данных я получаю сообщение об ошибке при вставке данных в базу данных. Проблема связана с форматом даты. Я исправил проблему и снова успешно вставил ее в базу данных.

Но проблема в том, что значение автоинкремента (первичный ключ) пропускается, а также меняется следующее значение последовательности. Как мне прекратить пропускать значение автоинкремента, когда я получаю ошибку базы данных во внешнем интерфейсе?

public function save_contract() { 

        date_default_timezone_set('Asia/Dubai');
        //$created_Dt        = '2019-07-03';
        $created_Dt        = date('Y-m-d H:i:s');
        $this->db->select('NEXT VALUE FOR contacts_seq as contractid');
        $query = $this->db->get();

        foreach ($query->result_array() as $row)
        {
           $contract_number = $row['contractid'];
           //echo $contract_number;
        }



    $data = array(
           'Contract_no' => $this->input->post('getcontract_no'). $contract_number,
            'status' => "active",
            'created_Dt' => $created_Dt
        );

 $insert_id = 0;
     if($this->db->insert("contract", $data)){
        $insert_id = $this->db->insert_id();
        }
       return $contract_number;

    }

созданная последовательность

CREATE SEQUENCE  contacts_seq AS INT
 START WITH 1
 INCREMENT BY 1

1 Ответ

3 голосов
/ 03 июля 2019

Свойство IDENTITY не использует значения повторно.От IDENTITY (Transact-SQ) - Примечания (выделено мной):

Свойство идентификации в столбце не гарантирует следующее:

  • Уникальность значения - Уникальность должна обеспечиваться с помощью ограничения PRIMARY KEY или UNIQUE или индекса UNIQUE.

  • Последовательные значения в транзакции - транзакция, вставляющая несколько строк,не гарантируется получение последовательных значений для строк, потому что другие параллельные вставки могут произойти в таблице.Если значения должны быть последовательными, то транзакция должна использовать монопольную блокировку таблицы или уровень изоляции SERIALIZABLE.

  • Последовательные значения после перезапуска сервера или других сбоев -SQL Server может кэшировать значения идентификаторовпо соображениям производительности и некоторые из присвоенных значений могут быть потеряны во время сбоя базы данных или перезапуска сервера.Это может привести к пробелам в значении идентичности при вставке.Если пропуски неприемлемы, приложение должно использовать собственный механизм для генерации значений ключей.Использование генератора последовательностей с опцией NOCACHE может ограничить пропуски транзакциями, которые никогда не фиксируются.

  • Повторное использование значений - Для данного свойства идентификатора с определенным начальным значением / приращением значения идентификаторане используется двигателем Если конкретный оператор вставки завершается неудачно или если оператор вставки откатывается, то использованные значения идентификаторов теряются и больше не будут генерироваться.Это может привести к появлению пропусков при создании последующих значений идентификаторов.

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

Это означает, что если вы INSERT aстрока и транзакция откатывается, по какой-то причине, это семя будет не повторно использованоТо же самое верно, если вы удаляете строку;существующие строки не будут повторно заполнены, а затем будет использовано «новое» следующее значение;в ваших числах будет пробел.

Значение IDENTITY предназначено исключительно для использования с реляционной точки зрения, а не для создания последовательных значений в вашей таблице, которые будут поддерживаться.Если вам нужны последовательные значения в время выполнения , вы должны использовать ROW_NUMBER.Если вы хотите сохранить их, вам будет лучше посмотреть SEQUENCE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...