2016-11-29 7 views
1

У меня есть столбец в моем db "id" int(11) NOT NULL AUTO_INCREMENT,, и я хочу, чтобы в этой таблице было несколько строк с тем же значением id. Поэтому, вставляя в таблицу, я хотел бы сказать, нужно ли ей увеличивать или значение остается sasme. Есть ли простой способ, как это сделать?Используйте автоматическое приращение только при необходимости

+0

Не должно быть '\' id \ 'int (11) NOT NULL AUTO_INCREMENT,'? –

+0

Когда это 'id', он должен быть уникальным, не так ли? –

+0

Да, я прошу прощения за неправильный синтаксис, но здесь это не существенно. И хорошо, я могу изменить имя столбца id, но идея вопроса остается прежней, не так ли? :-) Другое дело, что auto_increment можно использовать только для уникальных значений, как @sagi говорит в ответе. –

ответ

1

В MySQL документации по auto_increment говорит (выделение мое):

Ни одно значение не было задано для столбца AUTO_INCREMENT, так MySQL присвоены порядковые номера автоматически. Вы также можете явно указать , чтобы назначить 0 столбцу для генерации порядковых номеров, если не включен режим NO_AUTO_VALUE_ON_ZERO SQL. Если столбец объявлен NOT NULL, также можно назначить NULL столбцу для генерации порядковых номеров. Когда вы вставляете какое-либо другое значение в столбец AUTO_INCREMENT, столбец устанавливается на это значение, а последовательность сбрасывается, так что следующее автоматически сгенерированное значение следует последовательно от наибольшего значения столбца.

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

Там несколько вещей, которые вы должны обратить внимание на:

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

  2. Вы не можете использовать ограничение первичного/уникального индекса в поле auto_increment.

Альтернатива - иметь отдельную таблицу только для auto_increment и не использовать auto_increment в основной таблице. Если вам нужен новый идентификатор, то просто вставьте запись в таблицу auto_ncrement, получите увеличенный идентификатор и используйте его для вставки записи в основную таблицу. В противном случае просто введите значение id из основной таблицы и используйте его во вставке.

+0

Спасибо, я использовал альтернативное решение, отлично выглядит. –

0

Столбец auto_increment удостоверяется, что значения в нем уникальные! Таким образом, вы не можете сделать это таким образом.

Вместо этого я бы предложил триггер, объединив нужную логику.

+0

Спасибо, вы можете показать пример этого триггера? –

+0

Ну, я понятия не имею, каковы критерии, так что нет. – sagi

0

Для таблиц 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 для генерации значений последовательности. В результате таблица будет содержать одну последовательность, а не последовательность каждого значения ВРП

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

  • Нет связанных вопросов^_^