2013-07-17 2 views
8

Я пытаюсь настроить сценарий для создания определенного набора тестовых данных в моей базе данных, в начале которого я хочу очистить соответствующие таблицы, не отбрасывая ограничения (поскольку тест данные не являются подходящим местом для восстановления ограничений) и сбросить AUTO_INCREMENT для каждой таблицы, так как настройка тестовых данных намного проще, если я могу жестко закодировать многие идентификаторы.Auto-increment не сбрасывается в MySQL

К примеру, у меня есть два заявления, как это (есть пара почти для каждой таблицы):

DELETE FROM AppointmentAttr 
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1 

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

Если я делаю то же утверждение в MySQL Workbench, он также не возвращает его.

Это база данных INNODB.

Что мне не хватает?

(Примечание: я не могу использовать TRUNCATE из-за наличия ограничений).

+2

Почему бы не просто обрезать стол? Это воссоздает его по существу со всеми ограничениями и т. Д.? – Namphibian

+0

@Namphibian: не удается обрезать таблицу с активными ограничениями, и, как я сказал в вопросе, я не хочу бросать и воссоздавать ограничения в скрипте для создания тестовых данных. –

+0

Какие ограничения? –

ответ

12

MySQL не позволяет вам уменьшить значение AUTO_INCREMENT, как указано здесь: http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

Вы не можете сбросить счетчик на значение меньше или равно значению, которое используется в настоящее время. Для InnoDB и MyISAM, если значение меньше или равно максимальному значению, находящемуся в настоящее время в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального значения столбца AUTO_INCREMENT плюс один.

Даже с ограничениями, я хотел бы попробовать одно из следующих действий:

  1. Явных вставить свои идентификаторы для тестовых данных. У MySQL нет проблем с этим, в отличие от некоторых других движков базы данных.
  2. Удалите и заново создайте свой столбец идентификационной информации (или просто измените его на идентификатор), если ограничения не на нем сами.
  3. Не используйте столбец Identity и используйте другой метод (например, процедуру или внешний код) для управления вашей идентификационной информацией. Это действительно последнее средство, и я бы вообще не рекомендовал его ...

Примечание от OP: Это было то, что мне было нужно.

+1

Хороший ответ Я не думал о явной вставке идентификатора. Не то, что вы обычно делаете. – Namphibian

+0

Ну, дух! Спасибо чувак. –

+1

Отличная идея просто удалить столбец и воссоздать. Полностью сработал. – Rarw

9

Из того, что я могу видеть в инструкции alter table.

Вы можете сбросить значение автоматического прироста, используя оператор ALTER TABLE. Синтаксис оператора ALTER TABLE, чтобы сбросить значение автоматического приращения выглядит следующим образом:

ALTER TABLE table_name AUTO_INCREMENT = value; 

Необходимо указать имя таблицы после пункта TABLE ALTER и значение, которое мы хотим сбросить в экспрессии AUTO_INCREMENT = значение.

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

В чем заключается ваша проблема. Я подозреваю. Поэтому в основном вы остались с парой вариантов следующим образом:

  1. TRUNCATE ТАБЛИЦА: который, согласно нашей дискуссии не вариант
  2. DROP и пересоздать таблицу: длинный и болезненный опыт
  3. ALTER auto number column: я не пробовал это, но теоретически можно было бы изменить столбец первичного ключа с автоматического номера на int, а затем снова сделать его автоматически. Что-то вроде:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn BIGINT NOT NULL; 
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn BIGINT AUTONUMBER NOT NULL; 
    

Надеюсь это поможет немного.

+2

Если просто удалите 'AUTONUMBER', а затем верните его, как это сделал Намф, здесь работает для этой конкретной проблемы, я бы сказал, что это лучший ответ на проблему. –

+0

не должен' AUTONUMBER' быть 'AUTO_INCREMENT'? – dazito

+1

Снижение автоматического увеличения и считывания. Спасибо. – geilt

4

Не можете ли вы drop the relevant, auto increment column и воссоздать его? Пример следующим образом:

;;assuming your column is called id and your table is tbl 
ALTER TABLE tbl DROP COLUMN id; 
ALTER TABLE tbl ADD COLUMN id BIGINT UNSIGNED DEFAULT 1 PRIMARY KEY FIRST; 

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

+0

Нет, я не хочу вмешиваться в определение базы данных при настройке тестовых данных. И это закончилось бы из-за нарушений ограничений по той же причине, что и TRUNCATE TABLE. –

+0

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

+0

@TimOgilvy У него не было upvotes, потому что это не решило проблему OP. Я рад, что это вам помогло. – hd1

1

Я столкнулся с этой проблемой, когда удалил средние строки из таблицы. Моим ответом было бы ВСТАВИТЬ НОВЫЕ ДАННЫЕ НЕ СУЩЕСТВУЮЩЕГО ИДЕНТИФИКАЦИИ. Я ожидаю, что мой ответ по-прежнему будет полезен, даже если это PHP не MYSQL.

  1. Сначала введите данные.
  2. если найден не существует строки Вставить значения и выйти;
  3. else if not found in whole loop then then inserting for default value;

    $rez = mysql_query("SELECT * FROM users"); 
    $exists = 1; 
    while($row = mysql_fetch_array($rez)){ 
         if ($exists != $row{'id'}){ 
           echo "found not existing id: ".$exists; 
           INSERT INTO users VALUES($exists,.. ,..); 
           exit; 
         } $exists += 1; 
    } 
    INSERT INTO users VALUES(NULL,.. ,..); ##auto_inc column converts NULL to latest 
    

Я надеюсь, что это поможет как-то.

+0

Другой вариант - сбросить данные только, изменить соответствующие вещи в схеме, обрезать таблицу и затем повторно импортировать данные. Затем будет синхронизировано все вместе. –

0

В не проблематичных обстоятельствах вы можете сделать

ALTER TABLE tbl AUTO_INCREMENT = 0; 

приносит значение auto_increment до самого низкого уровня позволили в то время.

+0

В этом вопросе явно указано, что ограничения внешнего ключа не позволяют это исправление. – Toothbrush

0

ALTER TABLE tbl DROP COLUMN id; 
ALTER TABLE tbl ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
в вашем PHPMYADMIN

+0

вы можете уточнить? – kommradHomer

+0

Они предлагают полностью удалить столбец, а затем повторно добавить с новыми идентификаторами – Adders

+0

просто удалить параметр auto_increment и прочитать его достаточно, не удаляя весь столбец – user345

0

ALTER TABLE table_name AUTO_INCREMENT = value;
Это работает для меня, я должен был установить его к последней записи в моей базе данных, проходя через панель операций никогда не работал для меня.

0

Я уверен, что это было давно ответило, но когда мне нужно усечь, и я не могу просто сделать set foreign_key_checks = 0, тогда запустите мой обрез, а затем set foreign_key_checks = 1.

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