2014-09-10 21 views
0

今天,我在一個MySQL表插入行,但奇怪的事情發生,因爲具有較高的主ID,最後添加的行一些其他行之前以較低的ID其他一些行和後像這樣低ID :MySQL表列出行並不是爲了

+---------+ 
| 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' 
+0

驗證這一點,請運行'SHOW CREATE TABLE mytable' \ G和運行'SELECT * FROM mytable'和後兩者的輸出。 – RolandoMySQLDBA 2014-09-10 17:34:32

+0

請閱讀[我的帖子](http://meta.stackoverflow.com/a/271056/2733506)關於如何正確提出問題......它將幫助你得到一個合適的答案 – 2014-09-10 17:34:32

+0

也行的順序是插入表中應該沒有關係。當你運行一個SELECT語句時,只需使用ORDER BY來確保它的順序就像你已經應該做的那樣。並且PRIMARY ID應該自動遞增,不知道爲什麼你會自己指定它。 – 2014-09-10 17:36:24

回答

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; 

和比較輸出

+0

是的,這是我的想法,但我改變了user_name非唯一鍵,仍然沒有解決問題我將進一步測試,看看有什麼問題。 – TooCooL 2014-09-10 17:59:30

+0

我嘗試SELECT web_id用戶和輸出是一樣的我的問題,所以我想這個問題是web_id – TooCooL 2014-09-10 18:03:42