должны ли мы использовать float в качестве первичного ключа в sql-server

кто-то предложил мне использовать float в качестве первичного ключа таблицы вместо использования BIGINT. можем ли мы сделать первичный ключ float идентичностью ?

4 ответов


вопросы:

  • вы можете сделать первичный ключ поля float.
  • вы не можете сделать идентификатор поля float. Столбцы идентификаторов должны иметь тип данных int, bigint, smallint, tinyint или decimal или numeric с шкала 0
  • вы абсолютно не должны использовать поле float в качестве PK. Опять же, вы можете, SQL Server позволит вам, но не рекомендуется в основном потому, что поплавки неточны, как сказал @Andy.

зачем нужен поплавок, как ПК в любом случае? Вам нужно значение типа 3,1234235234534 для уникальной идентификации строки?


обратите внимание, как, если вы делаете float a=1f и float b=1f, они одинаковы ?

однако, если(a==b), вероятно, не будет истинным, поскольку поплавки неточны.


Почему бы не использовать большой тип данных для первичных ключей:

держите "ширину" ваших индексов как можно более узкой. Это уменьшает размер индекса и уменьшает количество считываний диска, необходимых для чтения индекса, повышая производительность.

Если возможно, попробуйте создать индексы для столбцов с целочисленными значениями вместо символов. Целочисленные значения имеют меньше накладных расходов, чем символьные значения.

Не используйте FLOAT или реальные типы данных для первичных ключей, так как они добавьте ненужные накладные расходы и может повредить производительности.

индексы на узких столбцах предпочтительнее индексов на широких столбцах. Чем уже индекс, тем больше записей SQL Server может поместиться на странице данных, что в свою очередь уменьшает объем ввода-вывода, необходимый для доступа к данным.

уменьшите размер ключей, таким образом уменьшающ прочитанный I/O во время процесса соединения, и увеличивающ общую производительность.


вы не можете сделать float как личность.

и очень плохая идея использовать float в качестве первичного ключа. Вы должны пойти с bigint.