2013-11-30 2 views
3

Я использую MySQL. Я создаю две новые таблицы. После вставки новой строки в сотрудников таблицы, я намеренно пытаюсь вставить новую строку в Заказы таблицы, ссылки не существует в сотрудников таблицы (я знаю, что это будет производить сообщение об ошибке). После этого, когда я пытаюсь вставить новую строку в Заказах таблицы, ссылка есть в сотрудниках таблицы она выполняется успешно, но теперь первый ряд Заказов таблицы имеет идентификатор 2. Почему возрастает даже при первой вставке оператор не можетПочему столбец auto_incremnt увеличивает его значение после выполнения инструкции вставки

CREATE TABLE Employees 
(
EmpID SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
EmpFN VARCHAR(20) NOT NULL 
) 
ENGINE=INNODB; 

CREATE TABLE Orders 
(
OrderID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
EmpID SMALLINT NOT NULL, 
FOREIGN KEY (EmpID) REFERENCES Employees (EmpID) 
) 
ENGINE=INNODB; 
+0

У меня нет времени для проверки моего заявления, поэтому это всего лишь комментарий. Но я предполагаю, что InnoDB поддерживает транзакцию и полностью заполняет парадигму ACID и уникальность значения 'auto_incremenet', это самый безопасный способ не возвращать' auto_increment', даже если транзакция или никакая другая транзакция не выполняются. –

ответ

3

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

За этим стоит задача производительности. Существует скрытый счетчик за AUTO_INCREMENT, который сохраняет фактическое значение. Таким образом, в последовательности нет транзакционных издержек, что может быть значительным в распределенной транзакционной среде. Кроме того, db может предварительно вычитать больше значений с диска в свою память, что значительно снижает требуемый диск io.

1

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

Поэтому, когда вы пытаетесь вставить с помощью внешнего ключа, ему почти нужно вставлять и следующий индекс увеличивать, но по вашему ограничению внешнего ключа он будет выполняться как удаленная последняя строка.

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

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