2012-07-21 25 views
10

私は、より大きなサイズのデータ​​型から小さなサイズのデータ​​型に変換するのは、あまりにも危険で危険なことを知っています。ただし、この場合、BIGINT UNSIGNED列の値がINT列の最大サイズより大きくなることはほとんどありません。BIGINT UNSIGNEDをINTに変換する

したがって、MySQLを使用して、私はテーブル構造を読んでいます。 information_schema.columns.ordinal_positionコラムを読んでいるうちに、そのタイプがBIGINT UNSIGNEDであることに気付きました。さて、私はこれを私の処理目的の代わりにINTとしたいと思います。私はキャストしたい/ SQLの型を変換します。

CASTおよびCONVERTは明らかにデータ型の符号を変更することができます。

SELECT CAST(ordinal_position AS SIGNED) 
FROM information_schema.columns 

具体的にはINTとして返されます。例えば。列を最大値のINTにチョップし、その値を返します。

今のところ、私は値を戻した後にデータ型を変更します。しかし、私はSQLでそれを行う方法を知りたいです。

Create the function that will perform the conversion:

CREATE FUNCTION BigToInt (n BIGINT) RETURNS INTEGER RETURN n;

As you can see, the function is very short and simple: It takes a BIGINT and immediately returns it as an ordinary integer. However, one consequence of this is that some of the data will be truncated down to the largest possible value for Int.

( - あなたはまだあなたがすでにそれは符号なしの部分を削除していたキャストとそれを組み合わせることができない場合は、おそらくあなたは、署名に「UNSIGNED」を追加することができます):

答えて

6

this articleは解決策を持っているようです。

+1

機能を作成せずに行う方法はありますか?使用後に機能を解体することを忘れないようにすることは厄介です。 – Pacerier

0

あなたがそのように関数を作成しようとすると、このエラーが表示されます:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, 
or READS SQL DATA in its declaration and binary logging is enabled 
(you *might* want to use the less safe log_bin_trust_function_creators 
variable) 

はそれを解決する方法の詳細については、このリンクを参照してください:

http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html

+1

この場合、修正は 'DETERMINISTIC'を追加することです。 – dolmen

1

私は残念ながらなかったです私が働いていたDBに関数を作成する権利がないので、いくつか試してみたところ、これはうまくいきました:

ALTER TABLE table_name MODIFY column_name INTEGER; 

私は15の外部キーを書き直す必要がありました。

関連する問題