「今の時代、基本的に、SQL Serverとかで float は使うべきではない。」(http://10395.diarynote.jp/200909072116364066/ )を書いた直後くらいに
「SQLServer Float Primary Key」での検索でアクセスがあった。
トラぶりそうだし面白そうだとおもいつつ、1年半ほど放置していたが、実験してみることにした。

SQL Server 2008 で試しました。

CREATE TABLE FloatKeyTable(
FloatKey FLOAT CONSTRAINT PK_FloatKeyTable PRIMARY KEY
, Description NVARCHAR(50)
)


コマンドは正常に完了しました。


INSERT INTO FloatKeyTable(
FloatKey
, Description)
VALUES(8,’8’)


(1 行処理されました)


INSERT INTO FloatKeyTable(
FloatKey
, Description)
VALUES(8,’8’)


メッセージ 2627、レベル 14、状態 1、行 1
制約 ’PK_FloatKeyTable’ の PRIMARY KEY 違反。オブジェクト ’dbo.FloatKeyTable’ には重複したキーを挿入できません。
ステートメントは終了されました。


INSERT INTO FloatKeyTable(
FloatKey
, Description)
VALUES(
(CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10
, ’(CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10’)


(1 行処理されました)


INSERT INTO FloatKeyTable(
FloatKey
, Description)
VALUES(
(CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10
, ’(CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10’)


メッセージ 2627、レベル 14、状態 1、行 1
制約 ’PK_FloatKeyTable’ の PRIMARY KEY 違反。オブジェクト ’dbo.FloatKeyTable’ には重複したキーを挿入できません。
ステートメントは終了されました。


SELECT * FROM FloatKeyTable


FloatKey Description
---------------------- --------------------------------------------------
8 (CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10
8 8

(2 行処理されました)


SELECT * FROM FloatKeyTable
WHERE
FloatKey = 8


FloatKey Description
---------------------- --------------------------------------------------
8 8

(1 行処理されました)


SELECT * FROM FloatKeyTable
WHERE
FloatKey = (CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10


FloatKey Description
---------------------- --------------------------------------------------
8 (CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10

(1 行処理されました)


DELETE FROM FloatKeyTable WHERE FloatKey = 8


(1 行処理されました)


SELECT * FROM FloatKeyTable


FloatKey Description
---------------------- --------------------------------------------------
8 (CAST(0.1 AS FLOAT) + CAST(0.7 AS FLOAT)) * 10

(1 行処理されました)

コメント