Updating AUTO_INCREMENT value of all tables in a MySQL database

Вызов именованного шаблона не меняет текущий контекст. Вместо:

<xsl:call-template name="model"  />

try:

<xsl:apply-templates select="xmi:XMI/uml:Model"/>

В противном случае вы останетесь в контексте корневого узла /, который не имеет каких-либо атрибутов, которые вы пытаетесь использовать извлечения.

И тогда, конечно, шаблону, совпадающему с uml:Model, не нужно иметь имя.

30
задан pars 29 August 2010 в 16:37
поделиться

3 ответа

Использование:

ALTER TABLE some_table AUTO_INCREMENT = 0

... сбросит значение auto_increment на следующее значение на основе наибольшего существующего значения в столбце auto_increment.

Чтобы выполнить это для всех таблиц, вам потребуется использовать динамический синтаксис SQL MySQL под названием PreparedStatements , поскольку вы не можете указать имя таблицы для оператора ALTER TABLE в качестве переменной. Вам придется зацикливаться на выходных данных из:

SELECT t.table_name
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_schema = 'your_database_name'

... запускать инструкцию ALTER TABLE выше для каждой таблицы.

42
ответ дан 27 November 2019 в 23:37
поделиться

В приведенных ниже инструкциях вам необходимо заменить все, что находится в [скобках], на правильное значение. РЕЗЕРВНОЕ КОПИРОВАНИЕ ПЕРЕД ПОПЫТКОМ.

Если вы можете войти в mysql с правами root через командную строку, вы можете сделать следующее, чтобы сбросить auto_increment для всех таблиц, сначала мы создадим наши запросы, которые мы хотим выполнить:

Создать базу данных резервная копия:

mysqldump -u [uname] -p [dbname] | gzip -9 > [backupfile.sql.gz]

Логин:

mysql -u root -p

Установите для group_concat_max_length более высокое значение, чтобы наш список запросов не усекался:

SET group_concat_max_len=100000;

Создать наш список запросов с использованием следующего:

SELECT GROUP_CONCAT(CONCAT("ALTER TABLE ", table_name, " AUTO_INCREMENT = 0") SEPARATOR ";") FROM information_schema.tables WHERE table_schema = "[DATABASENAME]";

Затем вы получите длинную строку запросов mysql, сопровождаемых кучей тире. Скопируйте строку запросов в буфер обмена, она будет выглядеть примерно так:

ALTER table1 AUTO_INCREMENT = 0;ALTER table2 AUTO_INCREMENT = 0;...continued...

Перейдите в базу данных, для которой вы хотите выполнить команду:

USE [DATABASENAME];

Затем вставьте Строка, которая находится в вашем буфере обмена и нажмите Enter, чтобы запустить его. Это должно запустить alter для каждой таблицы в вашей базе данных.

Запутались? Восстановление из резервной копии, обязательно выйдите из mysql перед запуском следующего (просто наберите exit;, чтобы сделать это)

gzip -d < [backupfile.sql.gz] | mysql -u [uname] -p [dbname]

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

6
ответ дан 27 November 2019 в 23:37
поделиться

Предполагая, что вы должны исправить это, изменив столбец автоинкремента, а не внешние ключи в таблице, разлагающей отношение N:M, и что вы можете предсказать, какие значения являются правильными, попробуйте использовать временную таблицу, в которой соответствующий столбец не является автоинкрементным, затем отобразите его обратно вместо исходной таблицы и впоследствии измените тип столбца на автоинкрементный или усеките исходную таблицу и загрузите данные из временной таблицы.

1
ответ дан 27 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

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