2016-08-09 10 views
0

У меня есть существующая таблица sql с 3 столбцами и более 100 записей/строк. Существует столбец идентификатора с автоинкрементами.Таблица SQL - Как добавить строку в начале старого столбца автоинкремента

Теперь я хочу добавить 10 новых строк в начале таблицы с идентификатором от 1 до 10. Но я не могу потерять существующую строку. Итак, как мне это сделать?

Одна идея, которая мне пришла в голову, - возможно, я могу увеличить существующий идентификатор, добавив 10, например, 1 + 10 станет 11, 25 + 10 станет 35, а затем я могу добавить строки в начале. Каким будет сценарий для этого, если это возможно?

+3

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

+0

но, я пробовал, и это сработало. UPDATE 'table' SET' id' = 'id' + 10 – dngs

+1

' Я хочу добавить 10 новых строк в начале таблицы с идентификатором от 1 до 10' - нет, вы этого действительно не хотите. Я знаю, что ты думаешь, что делаешь, но ты этого не делаешь. Все возможно, и я лично не дам вам код для совершения этого зверства.Решение, о котором вы говорите, забывает о том, что нужно возиться с 'auto_increment', создавая еще один столбец, который вы назовете' order_id', вы проиндексируете его, а затем вы закажете свои строки при * извлечении *, используя этот самый столбец. Теперь, вы можете принять мой совет, или вы можете иметь, о, так весело, когда 'auto_increment' укусит вас. И будет. –

ответ

0

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

Например, если вы вставили строки с идентификаторами 1-100, вы можете:

Проверьте следующее значение auto_increment командой:

select auto_increment as val from information_schema.tables where table_schema='myschema' and table_name='mytable'; 

Предположим, что значение будет 101 (значение, будет использоваться, если вы вставили новую строку). Вы можете «заранее» значение auto_increment командой:

alter table myschema.mytable auto_increment = 111; 

Если вставить новую строку, как это:

insert into mytable (not_the_id_column) values ('test'); 

Он получит «следующий» идентификатор из 111. Но если указать идентификатор значения вручную, вы хорошо в этом случае до тех пор, пока вы используете какое-либо значение меньше, чем 111, так что вы можете вставить желаемые записи, как это:

insert into mytable (id, not_the_id_column) values (101, 'test101'); 
insert into mytable (id, not_the_id_column) values (102, 'test102'); 
... -- more inserts as needed 

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

+0

Мне что-то не хватает, как это ответит на вопрос? – Uueerdo

+0

@Uueerdo OP хочет вставить 10 новых строк, где идентификатор (столбец автоинкремента) будет содержать значения, которые не будут мешать существующим данным или будущим значениям, генерируемым автоинкрементами. В этом ответе просто показаны различные способы, с помощью которых параметр auto_increment MySql может использоваться для решения этой проблемы, без указания каких-либо чрезмерно конкретных деталей реализации (например, явно установленные значения id * могут быть 1-10, но они могут и не быть). – SlimsGhost

-2

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

SELECT MAX(id)-MIN(id)+1 INTO @x FROM theTable; 
UPDATE theTable SET id = id + @x; 
SELECT MIN(id) INTO @x FROM theTable; 
UPDATE theTable SET id = 10 + id - @x; 

Если идентификатор является первичным ключом, коллизии значений в рамках обновления могут заставить MySQL отклонить обновление. (Отсюда пара обновлений, чтобы избежать такой возможности.)

Редактировать: Факторинг решительного возражения НБ в этом случае, вероятно, было бы неплохо проверить, что следующее значение автоматического прироста таблицы не будет сталкиваться с обновленные записи после завершения обновления. У меня нет соответствующей базы данных, чтобы проверить, влияют ли на нее утверждения UPDATE; и даже если они действительно повлияют на это, вы можете в конечном итоге захотеть уменьшить его, чтобы не создавать ненужный пробел (пробелы в идеале не должны быть проблемой, но если они есть или вы просто слегка OCD, стоит заглянуть) ,

+1

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

+0

@ N.B. когда вы наследуете долгосрочный проект, который вы не запускали, который полагается на то, что он находится в последовательном порядке, и вам нужно вставить данные, потому что многочисленные системы просто не могут справиться с текущим состоянием, тогда другие отказываются от помощи по принципу (и эффективно предлагая вам переписать летнюю ценность кода) действительно не ... хорошо ... полезно. ... и какие обстоятельства вы видели, MySQL не выдавал auto_increments в порядке? – Uueerdo

+1

Если вы унаследовали проект, который использует 'auto_increment' таким неправильным способом, то вы его исправляете, а исправление тривиально, добавьте столбец, который действует как упорядочивающий. Откуда мне знать? До сих пор, за последние 15 лет, что я делаю эту работу, я видел и фиксировал сотни таких проектов. Просто нет оправдания. Если вы эксперт, если вам платят за то, что вы делаете, и если вы видите что-то подобное - это означает, что ваш работодатель будет поражен технологической задолженностью, а это означает, что в конечном итоге они потеряют деньги. Вы несете ответственность за это. –