MySQL: несоответствие автоинкремента в идентификаторах - PullRequest
3 голосов
/ 22 января 2011

Интересно, сталкивались ли вы с этим, что номера идентификатора автоматического приращения не располагаются в правильном порядке , когда вы нажимаете кнопку Обзор на phpMyAdmin - это только я? Что-то я неправильно настроил в таблице БД?

Например, когда вы вставляете серию данных в таблицу и также удаляете некоторые из них, поэтому, когда вы проверяете эту таблицу в phpMyAdmin, эти данные должны отображаться в таком порядке, как

id

2
24
28
296
300

но в большинстве моих таблиц они не отображаются в порядке, вместо этого они выглядят примерно так:

id

24
300    
2
296    
28

как на этой картинке ниже,

alt text

Можем ли мы что-то с этим сделать, чтобы идентификаторы появлялись в правильном порядке?

РЕДАКТИРОВАТЬ 1:

Я думаю, что большинство из вас неправильно поняли проблему, на которую я здесь напал. Я имею в виду, когда вы нажимаете кнопку Браузер на phpMyAdmin, чтобы вывести список всех данных в ваших таблицах, а не когда вы используете SQL-запрос для вывода списка с помощью order by.

Имеет ли это смысл?

alt text

РЕДАКТИРОВАТЬ 2:

Это одна из структур моей таблицы - помогает ли вам понять, что в ней не так?

CREATE TABLE IF NOT EXISTS `root_pages` (
  `pg_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pg_url` varchar(255) DEFAULT NULL,
  `pg_title` varchar(255) DEFAULT NULL,
  `pg_subtitle` varchar(255) DEFAULT NULL,
  `pg_description` text,
  `pg_introduction` text,
  `pg_content_1` text,
  `pg_content_2` text,
  `pg_content_3` text,
  `pg_content_4` text,
  `pg_order` varchar(255) DEFAULT NULL,
  `pg_hide` varchar(255) DEFAULT '0',
  `pg_highlight` varchar(255) DEFAULT '0',
  `pg_important` varchar(255) DEFAULT '0',
  `pg_parent` varchar(255) DEFAULT '0',
  `parent_id` varchar(255) DEFAULT NULL,
  `pg_cat_id` varchar(255) DEFAULT NULL COMMENT 'page category id',
  `ps_cat_id` varchar(255) DEFAULT NULL COMMENT 'post category id',
  `tmp_id` varchar(255) DEFAULT NULL COMMENT 'template id',
  `pg_backdate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `pg_created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `pg_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`pg_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Ответы [ 3 ]

7 голосов
/ 22 января 2011

Вы можете заказать выходную информацию так, как вам нравится: ORDER BY id ASC.

Записи в таблице не имеют собственного порядка.

2 голосов
/ 22 января 2011

Если вы хотите, чтобы они были упорядочены по идентификатору, тогда вы должны использовать предложение order by при выборе.

В SQL наборы, возвращаемые select, неупорядочены, если вы не укажете, в каком порядке вы хотите их использовать.

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

1 голос
/ 22 января 2011

Не уверен, относится ли это к вам, но ваш ПК типа INT?Если это какой-то VARCHAR или TEXT, его можно заказать, как показано в примере.И вы уверены, что этот столбец на самом деле ваш ПК?Разместите вывод таблицы SHOW CREATE TABLE, и она может стать более понятной.

И какой механизм хранения вы используете.Порядок выбора по умолчанию - это порядок вставки для MYISAM и PK для InnoDB, если я правильно помню.Это также будет зависеть от вашей версии MySql.Чтобы быть уверенным в любых обстоятельствах, вы ДОЛЖНЫ использовать ORDER BY в своем утверждении select.

...