[英]MySQL auto_increment column declared as float
我需要有關存儲在Ubuntu Linux服務器上的MySQL 5.5版數據庫中的表InnoDB的一些幫助。
在此表中,有一個主鍵列“ id”,其屬性自動遞增,並聲明為float。
當前,此表中存儲的自動增量值已達到較高的值(大約超過200萬)。
現在,當我轉儲(或選擇)該表中的一系列記錄時,我看不到從增量中獲得的正確值,而是四舍五入后的值(例如:2233937變為2233940,下一條記錄,依此類推,其他記錄也如此)。 當我導入MySQL轉儲文件時,這會導致故障,因為自動遞增值被舍入並且許多記錄具有相同的增量ID。
旁注。 在這個數據庫中,我還有其他情況相同的表(列主鍵聲明為float,具有auto增量屬性),但表中存儲了較小的增量值。 並且在這些表中,存儲的自動增量值具有正確的數字。
然后,我有以下問題:
1)為什么在此表中有此行為? 列已達到最大大小?
2)如何使用此表解決此問題?
非常感謝您的任何回復。
洛倫佐
UPDATE
目前,我已經采用這種方法來解決此問題。
我已經執行命令ALTER TABLE來將列的類型從float修改為integer,這似乎可行。
請,您能向我確認這是解決此問題的正確方法(或也許只是許多方法中的一種)嗎?
正如文檔中所提到的:
浮點數有時會引起混淆,因為它們是近似值而不是作為精確值存儲的。
本地測試提供了兩種選擇,但沒有保證(尤其是第二種選擇):
選擇1:
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` FLOAT UNSIGNED AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> (`id`)
-> VALUES
-> (2233937),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (16776999),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL);
Query OK, 32 rows affected (0.00 sec)
Records: 32 Duplicates: 0 Warnings: 0
mysql> SELECT `id`,
-> CONVERT(`id`, UNSIGNED)
-> FROM `tbl_test`;
+----------+-------------------------+
| id | CONVERT(`id`, UNSIGNED) |
+----------+-------------------------+
| 2233940 | 2233937 |
| 2233940 | 2233938 |
| 2233940 | 2233939 |
| 2233940 | 2233940 |
| 2233940 | 2233941 |
| 2233940 | 2233942 |
| 2233940 | 2233943 |
| 2233940 | 2233944 |
| 2233940 | 2233945 |
| 2233950 | 2233946 |
| 2233950 | 2233947 |
| 2233950 | 2233948 |
| 2233950 | 2233949 |
| 2233950 | 2233950 |
| 2233950 | 2233951 |
| 2233950 | 2233952 |
| 16777000 | 16776999 |
| 16777000 | 16777000 |
| 16777000 | 16777001 |
| 16777000 | 16777002 |
| 16777000 | 16777003 |
| 16777000 | 16777004 |
| 16777000 | 16777005 |
| 16777000 | 16777006 |
| 16777000 | 16777007 |
| 16777000 | 16777008 |
| 16777000 | 16777009 |
| 16777000 | 16777010 |
| 16777000 | 16777011 |
| 16777000 | 16777012 |
| 16777000 | 16777013 |
| 16777000 | 16777014 |
+----------+-------------------------+
32 rows in set (0.00 sec)
示例db-fiddle 。
選擇2 :(請小心)
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` FLOAT UNSIGNED AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> (`id`)
-> VALUES
-> (2233937),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (16776999),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL);
Query OK, 32 rows affected (0.00 sec)
Records: 32 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE `tbl_test` CHANGE `id`
-> `id` FLOAT(8, 0) UNSIGNED AUTO_INCREMENT;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float(8,0) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16777016 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> SELECT `id`
-> FROM `tbl_test`;
+----------+
| id |
+----------+
| 2233937 |
| 2233938 |
| 2233939 |
| 2233940 |
| 2233941 |
| 2233942 |
| 2233943 |
| 2233944 |
| 2233945 |
| 2233946 |
| 2233947 |
| 2233948 |
| 2233949 |
| 2233950 |
| 2233951 |
| 2233952 |
| 16776999 |
| 16777000 |
| 16777001 |
| 16777002 |
| 16777003 |
| 16777004 |
| 16777005 |
| 16777006 |
| 16777007 |
| 16777008 |
| 16777009 |
| 16777010 |
| 16777011 |
| 16777012 |
| 16777013 |
| 16777014 |
+----------+
32 rows in set (0.00 sec)
示例db-fiddle 。
其他感興趣的信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.