【问题标题】:Mysql table lists rows not in orderMysql表不按顺序列出行
【发布时间】:2014-11-04 11:01:55
【问题描述】:

今天我在 mysql 表中插入了一行,但发生了一些奇怪的事情,因为最后添加的主 ID 较高的行位于其他一些 id 较低的行之前,而在其他一些 id 较低的行之后,如下所示:

+---------+
| user_id |
+---------+
|   1     |
|   50    |
|   69    | <=== Wrong place
|   63    |
+---------+

这就是它在 phpmyadmin 和我的 php 脚本中的列出方式。我知道如果我没有在我的 php 脚本中定义列出行的顺序但是在 phpmyadmin 中我不知道为什么会发生这种情况。顺便说一句,这是我第一次看到这样的东西。

这是查询的结果:SHOW CREATE TABLE mytable

CREATE TABLE `users` (
    `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user,
     unique index',  `web_id` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s name',
    `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s password in salted and hashed format',
    `user_email` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s email',
    `domain` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    `address` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_firstname` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_lastname` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_phone` varchar(90) COLLATE utf8_unicode_ci NOT NULL,
    `billing_country` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    `git_auto_update` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Y',
    `server_id` int(16) NOT NULL,
    `trial` enum('0','1') COLLATE utf8_unicode_ci NOT NULL,
    `purchase_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`user_id`),
    UNIQUE KEY `user_name` (`user_name`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='user data'

【问题讨论】:

  • 请运行SHOW CREATE TABLE mytable\G 并运行SELECT * FROM mytable 并发布两者的输出。
  • 请阅读MY POST,了解如何正确提问...它将帮助您获得适当的答案
  • 在表中插入行的顺序也无关紧要。当您运行 SELECT 语句时,只需使用 ORDER BY 来确保它的顺序就像您应该做的那样。并且 PRIMARY id 应该自动递增,不知道你为什么要自己指定它。
  • @RolandoMySQLDBA 查看问题 thnx 中 SHOW CREATE TABLE 的结果
  • @JohnRuddell 尽管这不是恐慌的情况,但是当我看到这个的那一刻我很困惑,所以我很快就写下了我的问题

标签: mysql phpmyadmin


【解决方案1】:

这只是一个猜测,但在这里......

你的表格布局是

CREATE TABLE `users` (
    `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user,
     unique index',  `web_id` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s name',
    `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s password in salted and hashed format',
    `user_email` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s email',
    `domain` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    `address` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_firstname` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_lastname` varchar(166) COLLATE utf8_unicode_ci NOT NULL,
    `billing_phone` varchar(90) COLLATE utf8_unicode_ci NOT NULL,
    `billing_country` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    `git_auto_update` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Y',
    `server_id` int(16) NOT NULL,
    `trial` enum('0','1') COLLATE utf8_unicode_ci NOT NULL,
    `purchase_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`user_id`),
    UNIQUE KEY `user_name` (`user_name`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='user data'

我的直觉是user_id 值以user_name 的顺序出现。当同时存在 PRIMARY KEY 和 UNIQUE KEY 时,有时会发生这种情况。您可以通过运行来验证这一点

SELECT user_id,user_name FROM users;
SELECT user_id,user_name FROM users ORDER BY user_id;
SELECT user_id,user_name FROM users ORDER BY user_name;

并比较输出

【讨论】:

  • 是的,我就是这么想的,但是我将 user_name 更改为非唯一键,但问题仍然没有解决,我将对其进行更多测试以查看问题所在。
  • 我尝试了 SELECT web_id FROM users 并且输出和我的问题一样,所以我猜是 web_id 的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2011-04-17
相关资源
最近更新 更多