2017-05-16 4 views
0

Ubuntu Linuxサーバ上のデータベースMySQLバージョン5.5に格納されたテーブルInnoDBで助けが必要です。MySQL auto_incrementカラムがfloatとして宣言されました

この表には、属性auto incrementを持ち、floatとして宣言されているプリマートキー列 "id"があります。

現在、この表に格納されている自動インクリメント値は高い値(約200万以上)に達しています。

ここでは、このテーブルのレコードの範囲をダンプ(または選択)すると、増分からの正しい値が丸められた値を表示できません(たとえば、2233937 becames 2233940など)記録)。これは、自動インクリメント値が丸められ、多くのレコードが同じインクリメンタルIDを持つため、MySQLダンプファイルをインポートすると誤動作を引き起こします。

サイドノート。このデータベースでは、私は同じ状況(columプライマリキーが自動インクリメント属性を持つfloatとして宣言されていますが)に小さな増分値が格納されている他のテーブルを持っています。これらのテーブルでは、格納された自動インクリメント値が正しい数になります。この表で、私はこの振る舞いを持っているのはなぜ

1):

はその後、私はこれらの質問がありますか?列が最大サイズに達しましたか?

2)この表でこの問題をどのように解決できますか?

お返事ありがとうございます。

ロレンツォ

UPDATE

現在、私はこの問題を解決するには、この方法を採用しています。

私はALTER TABLEコマンドを実行して、列の型をfloatからintegerに変更しました。これはうまくいくようです。

この問題を解決するには、これが正しい方法(または多方面の方法の1つ)であることを私に確認できますか?

+0

なぜA_I列が浮動するのですか?それは問題を求めているだけです! – Martin

+0

@Martin: 'AUTO_INCREMENTは整数型と浮動小数点型にのみ適用されます。 ' [13.1.17 CREATE TABLEの構文](https://dev.mysql.com/doc/refman/5.5/en/create-table.html)を参照してください。 – wchiquito

+0

@ wchiquitoああ。私はこれにフロートを使用するのは夢中だと思うが、十分に公正な..... – Martin

答えて

0

としてはよくドキュメントに記載されている:彼らは概算と正確な値として格納されていない があるため

B.5.4.8 Problems with Floating-Point Values

浮動小数点数は時々混乱を引き起こします。

ローカルテストは、代替案のカップルを提示しますが、保証のない(特に第二の代替):

オルタナティブ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(注意が必要)。関心の

その他の情報:

+0

こんにちは@ wchiquito。お返事をありがとうございます。はい、私はそれが「単なる」丸められた値の問題であることを知りました。私は私の質問にいくつか更新しました。再度、感謝します。 – Lorenzo

+0

@Lorenzo:すべてが期待どおりに動作することを確認するには、実際の環境に非常に近い環境が必要です。ローカルテストでは、すべてが期待通りに機能しますが、ローカルテストのみです。問題を解決するためのより良い方法があるかもしれません。 – wchiquito

関連する問題