У меня есть столбец в моем db "id" int(11) NOT NULL AUTO_INCREMENT,
, и я хочу, чтобы в этой таблице было несколько строк с тем же значением id
. Поэтому, вставляя в таблицу, я хотел бы сказать, нужно ли ей увеличивать или значение остается sasme. Есть ли простой способ, как это сделать?Используйте автоматическое приращение только при необходимости
ответ
В MySQL документации по auto_increment говорит (выделение мое):
Ни одно значение не было задано для столбца AUTO_INCREMENT, так MySQL присвоены порядковые номера автоматически. Вы также можете явно указать , чтобы назначить 0 столбцу для генерации порядковых номеров, если не включен режим NO_AUTO_VALUE_ON_ZERO SQL. Если столбец объявлен NOT NULL, также можно назначить NULL столбцу для генерации порядковых номеров. Когда вы вставляете какое-либо другое значение в столбец AUTO_INCREMENT, столбец устанавливается на это значение, а последовательность сбрасывается, так что следующее автоматически сгенерированное значение следует последовательно от наибольшего значения столбца.
Это означает, что если вы определили перед вставкой текущего максимума поля auto_increment и явно вставить это значение в операторе вставки, то вы можете иметь повторяющиеся значения в поле auto_increment.
Там несколько вещей, которые вы должны обратить внимание на:
Если вы можете иметь параллельные вставки в таблицу, то вам, возможно, придется заблокировать таблицу для чтения, так и другой процесс не вставляет новая запись, вызывающая приращение поля.
Вы не можете использовать ограничение первичного/уникального индекса в поле auto_increment.
Альтернатива - иметь отдельную таблицу только для auto_increment и не использовать auto_increment в основной таблице. Если вам нужен новый идентификатор, то просто вставьте запись в таблицу auto_ncrement, получите увеличенный идентификатор и используйте его для вставки записи в основную таблицу. В противном случае просто введите значение id из основной таблицы и используйте его во вставке.
Спасибо, я использовал альтернативное решение, отлично выглядит. –
Столбец auto_increment
удостоверяется, что значения в нем уникальные! Таким образом, вы не можете сделать это таким образом.
Вместо этого я бы предложил триггер, объединив нужную логику.
Спасибо, вы можете показать пример этого триггера? –
Ну, я понятия не имею, каковы критерии, так что нет. – sagi
Для таблиц MyISAM вы можете указать AUTO_INCREMENT на вторичном столбце в индексе с несколькими столбцами. В этом случае генерируемое значение для столбца AUTO_INCREMENT вычисляется как MAX (auto_increment_column) + 1 WHERE prefix = given-prefix. Это полезно, если вы хотите поместить данные в упорядоченные группы.
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Which returns:
**grep id name**
fish 1 lax
mammal 1 dog
mammal 2 cat
mammal 3 whale
bird 1 penguin
bird 2 ostrich
Если столбец AUTO_INCREMENT является частью множества индексов, MySQL генерирует значения последовательности с использованием индекса, который начинается с столбца AUTO_INCREMENT, если таковой имеется. Например, если таблица животных содержит индексы PRIMARY KEY (grp, id) и INDEX (id), MySQL будет игнорировать PRIMARY KEY для генерации значений последовательности. В результате таблица будет содержать одну последовательность, а не последовательность каждого значения ВРП
Не должно быть '\' id \ 'int (11) NOT NULL AUTO_INCREMENT,'? –
Когда это 'id', он должен быть уникальным, не так ли? –
Да, я прошу прощения за неправильный синтаксис, но здесь это не существенно. И хорошо, я могу изменить имя столбца id, но идея вопроса остается прежней, не так ли? :-) Другое дело, что auto_increment можно использовать только для уникальных значений, как @sagi говорит в ответе. –