2012-03-17 2 views
3

Скажем, у меня есть таблица MySQL с автоматически увеличивающимся полем id, после чего я вставляю 3 строки. Затем я удаляю вторую строку. Теперь идентификатор таблицы равен 1,3. Могу ли я заставить MySQL исправить это и сделать его 1,2 без необходимости писать программу для этого?удалить пробелы в auto increment

+1

Это не намерение первичного ключа. Если вам нужны последовательные номера, не смотрите на первичный ключ. Чего вы пытаетесь достичь? –

+0

... (для продолжения из Ian Wood), если вы хотите последовательную нумерацию, а не PK, используйте 'rowid'. – slashmais

+0

Я пытаюсь изменить идентификатор строки от 1,2,4,5,7,8 и т. Д. до 1,2,3,4,5,6 и т. д. –

ответ

5

MySQL не позволит вам изменить индексацию столбца Auto-Index после его создания. То, что я делаю, это удалить столбец Auto-Index, а затем добавить новый с тем же именем, mysql будет индексировать вновь созданный столбец без пробелов. Делайте это только в таблицах, где Auto-Index не относится к остальным данным, а просто используется в качестве ссылки для обновлений и удалений.

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

НТН

+0

, но у меня есть некоторые связанные данные в другой таблице относительно auto increment id как внешнего ключа ,,, тогда как я это сделаю? –

+0

@ReNiShAR См. Http://stackoverflow.com/a/5437720/14660 – Schwern

0

Цитируя The Access Ten Commandments (и это может быть расширяемой с другими СУБД:. «Ты не будешь использовать Autonumber (или Auto Incremental), если поле предназначено, чтобы иметь смысл для пользователей твоих»

Единственной альтернативой я могу думать (использовать только MySQL) заключается в следующем:

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

Пример:

create table tbl_dummy(
    id int unsigned not null auto_increment primary key, 
    row_number int unsigned not null default 0, 
    some_value varchar(100) 
); 

delimiter $$ 

-- This trigger will add the correct row number for each record inserted 
-- to the table, regardless of the value of the primary key  
create trigger add_row_number before insert on tbl_dummy 
for each row 
begin 
    declare n int unsigned default 0; 
    set n = (select count(*) from tbl_dummy); 
    set NEW.row_number = n+1; 
end $$ 

-- This procedure will update the row numbers for the records stored 
-- after the id of the soon-to-be-deleted record, and then deletes it. 
create procedure delete_row_from_dummy(row_id int unsigned) 
begin 
    if (select exists (select * from tbl_dummy where id = row_id)) then 
     update tbl_dummy set row_number = row_number - 1 where id > row_id; 
     delete from tbl_dummy where id = row_id; 
    end if; 
end $$ 

delimiter ; 

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

Надеюсь, это поможет