MySQL Вставить автоинкрементное столкновение [дубликат]

Ответ принят. У меня была связанная, но немного другая ситуация, когда мне приходилось заполнять форму, но только внутри групп. Если у кого-то есть такая же потребность, знайте, что fillna работает над объектом DataFrameGroupBy.

>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})
>>> example
  name  number
0    a     0.0
1    a     1.0
2    a     2.0
3    b     NaN
4    b     4.0
5    b     NaN
6    c     6.0
7    c     7.0
8    c     8.0
9    c     9.0
>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 3
0    0.0
1    1.0
2    2.0
3    NaN
4    4.0
5    4.0
6    6.0
7    7.0
8    8.0
9    9.0
Name: number, dtype: float64
11
задан ctford 31 October 2009 в 13:50
поделиться

7 ответов

Автоинкремент будет использовать следующий доступный идентификатор для таблиц InnoDB и MyISAM.

Я тестировал это для MySQL 4.1.22, работающего в Windows Vista. Я создал две простые таблицы, один из которых использует InnoDB, а другой - с помощью MyISAM.

Я выполнил следующие команды (без ошибок):

INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert');
INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert');

SELECT * FROM MyIsamTest;

Я получил сообщение об ошибке, следующий результат, который показывает, что столбец «id» был правильно автоинкремент:

+=====+=========================+
| id  | description             |
+=====+=========================+
|   1 | autoincrement id insert |
+-----+-------------------------+
| 100 | manual id insert        |
+-----+-------------------------+
| 101 | autoincrement id insert |
+-----+-------------------------+

Я повторил эксперимент в моей таблице InnoDbTest с тем же результатом.

5
ответ дан ctford 20 August 2018 в 14:42
поделиться
  • 1
    У нас что-то происходит в транзакционной таблице innoDB, где она автоматически вводится вверх, но ниже максимального id. Я думаю, что этот простой тест просто слишком прост. Я уверен, что mysql будет автоматически пропускать существующие идентификаторы, но я не 100% – B T 1 July 2010 в 19:21
  • 2
    Да, у нас есть автоинкремент innoDb ниже max (id), а не shure, что произойдет – Vaclav Kohout 3 February 2016 в 15:37
  • 3
    Проблема с вашим тестом здесь заключается в том, что вы вставили с нормальной вставкой. У меня было довольно много проблем, когда я регулярно восстанавливал производственную базу данных на dev-сервере, а автоматические приращения dev-сервера не обновлялись и, следовательно, сталкивались с уже существующими документами, полученными из производства, когда я иду создавать новая запись в dev. – Martin Greenaway 3 January 2018 в 11:03

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

После вашей вставки вы можете установить автоматическое приращение на значение выше самый высокий id:

ALTER TABLE tbl AUTO_INCREMENT = 9000;
7
ответ дан Alexander Suraphel 20 August 2018 в 14:42
поделиться
  • 1
    +1 - очень вероятно, что есть несколько таблиц его устаревших данных, и это лучший способ обойти его. – nickf 30 September 2009 в 10:32
  • 2
    Не обязательно, это делается автоматически. – DisgruntledGoat 30 September 2009 в 11:19

MySQL не позволяет вам установить внутреннее значение auto_increment «value» ниже текущего максимального ID.

Поэтому, если вы добавляете 1000 строк, начинающихся с 5000, значение инкремента устанавливается равным 6000. Вы все еще могут добавлять строки с идентификаторами, которые еще не существуют (например, 4500), но это не стоит беспокоить. Есть много чисел от 6000 до 4 миллиардов.

0
ответ дан DisgruntledGoat 20 August 2018 в 14:42
поделиться

Попробуйте в тестовой базе данных и посмотрите, что происходит, с лампой / xampp и т. д.

0
ответ дан jack 20 August 2018 в 14:42
поделиться

Если у вас есть только одна таблица устаревших без зависимостей от идентификаторов, то то, что я сделал бы, это создать временную таблицу для вставки всех ваших новых данных (с идентификаторами 5000+). Затем запустите это:

INSERT INTO `myrealtable` (column1, column2, column3)
SELECT column1, column2, column3
FROM `temptable`;

DROP TABLE `temptable`;

... где ни один из столбцов columnX не является основным идентификатором auto_increment.

0
ответ дан nickf 20 August 2018 в 14:42
поделиться

Я считаю, что MySQL проверяет, вставляете ли вы в автоинкрементный столбец и обновляете AUTO_INCREMENT, чтобы AUTO_INCREMENT> MAX (id), но мне нужно просмотреть документы. Вы должны по-прежнему следовать за предложением Эндрю Даффи, чтобы быть в безопасности.

0
ответ дан outis 20 August 2018 в 14:42
поделиться

Если вы вставляете данные с уже назначенными первичными ключами в MyISAM, значение столбца AUTO_INCREMENT для следующей вставки будет max (столбец) + 1, поэтому он будет работать.

Однако вы не используя MyISAM, так как это важные данные, вы используете InnoDB, которому требуется оператор ALTER TABLE, указанный выше.

0
ответ дан peufeu 20 August 2018 в 14:42
поделиться
Другие вопросы по тегам:

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