Модель затем доступный первичный ключ

Я полагаю, вы ищете просто заменить последнюю 1 на 2.

=dateadd("m",-1,dateserial(year(Today),month(Today),2))
7
задан user20955 24 February 2009 в 00:11
поделиться

3 ответа

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

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

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

Childs @Stuart предполагает, что MySQL генерирует следующий идентификатор с MAX(column_name)+1 но это неправильно. Скажите вставку строки, и Значение идентификатора сгенерировано. Но Вы откатываете эту вставку, или впоследствии DELETE та строка. В следующий раз, когда Вы вставляете, MySQL генерирует совершенно новое Значение идентификатора. Таким образом, Значение идентификатора является одним большим, чем последнее Значение идентификатора, сгенерированное любым клиентом, независимо от того, какие строки в настоящее время хранятся в таблице.

Аналогично, если Вы вставляете, но сразу не фиксируете. Перед фиксацией некоторый другой клиент делает вставку. И Ваша сессия и сессия другого клиента будут иметь их собственное значение уникального идентификатора сгенерированным. Автоматически сгенерированные первичные ключи работают без учета к изоляции транзакции, для обеспечения уникальности.

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

20
ответ дан 6 December 2019 в 09:23
поделиться

Я думаю, что необходимо будет выполнить некоторый пользовательский SQL. SQL, в котором Вы нуждаетесь, будет конкретный DB. Насколько я знаю, нет никакого надежного способа сделать это в MySQL. Можно получить последний идентификатор вставки, но это - конкретная сессия (т.е. можно получить идентификатор последней записи, которую Вы вставили в свою сессию DB, но не последний идентификатор для другой сессии, которая, возможно, произошла после Вашей). Однако (и кто-то исправляет меня, если я неправ), MySQL генерирует следующий идентификатор с МАКСОМ (column_name) + 1, таким образом, Вы могли сделать то же.

PostgreSQL делает это намного легче с его функциями управления последовательностью.

Править:

Оказывается, что я думал AUTO_INCREMENT столбцы в многостолбцовом ключе, которые сгенерированы с МАКСОМ (column_name) +1. Однако точка все еще стоит, что нет никакого способа получить следующий идентификатор, прежде чем это будет сгенерировано вставкой, которая была исходным вопросом.

-1
ответ дан 6 December 2019 в 09:23
поделиться

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

Мое решение было следующим:

import copy
objectCopy=copy.copy(object)
objectCopy.pk=None
objectCopy.save()

Я имею в виду, если save () сделает это за вас, зачем вам делать это вручную?

0
ответ дан 6 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: