Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Поправете „Грешка при аритметично препълване при преобразуване на IDENTITY в тип данни…“ в SQL Server

Ако получавате грешка „Съобщение 8115, Грешка при аритметично препълване на ниво 16 при преобразуване на IDENTITY в тип данни… ” грешка в SQL Server, вероятно защото се опитвате да вмъкнете данни в таблица, когато е IDENTITY колоната е достигнала ограничението за типа данни.

IDENTITY колона автоматично увеличава стойността, която се вмъква с всеки нов ред. Ако вмъкнатата стойност е извън обхвата на типа данни на колоната, тогава ще възникне горната грешка.

Пример за грешката

Ето пример за код, който води до грешката:

INSERT INTO t1 VALUES ('Dog');

Резултат:

Msg 8115, Level 16, State 1, Line 1
Arithmetic overflow error converting IDENTITY to data type tinyint.

В този случай моята IDENTITY колоната използва tinyint тип данни, който има диапазон от 0 до 255. Грешката предполага, че IDENTITY колона се опитва да вмъкне стойност, която е по-висока от 255.

Това обикновено се случва, когато вече сме вмъкнали 255 реда в колоната и сега се опитваме да вмъкнем 256-ия ред.

Ето как изглежда моята таблица, когато избера всички редове, където IDENTITY колоната е по-голяма от 250 :

SELECT * FROM t1
WHERE c1 > 250;

Резултат:

+------+------+
| c1   | c2   |
|------+------|
| 251  | Ant  |
| 252  | Cow  |
| 253  | Bat  |
| 254  | Duck |
| 255  | Bull |
+------+------+

В този случай c1 е моята IDENTITY колона (която е тип tinyint ). Можем да видим това IDENTITY преди това е генерирал 255 за колоната и така следващата стойност, която се опитва да вмъкне, е 256 (приемайки стойност на увеличение от 1 и без по-рано неуспешни вложки). Това ще причини горната грешка, тъй като 256 е извън обхвата на tinyint .

Същият проблем може да възникне с типове данни smallint (максимална стойност 32 767) или int (максимална стойност от 2 147 483 647). Може да се случи и с bigint ако сте вмъкнали достатъчно редове (над 9,223,372,036,854,775,807).

Въпреки това, IDENTITY стойността не винаги съответства на броя на вмъкнатите редове. Можете да зададете начална стойност, когато създавате IDENTITY колона и можете също да зададете стойност на увеличение. Следователно можете лесно да достигнете горната граница много по-рано от броя на вмъкванията, извършени на масата, в зависимост от стойностите на началната стойност и нарастването.

Също така, изтриването на редове от таблица не нулира IDENTITY стойност (въпреки че съкращаването на таблица прави).

Следователно все още можете да изпитате горната грешка, дори когато има много по-малко редове в таблицата от това, което IDENTITY типът данни на колоната може да предложи.

Решение

Едно решение е да промените типа данни на IDENTITY колона. Например, ако е smallint , променете го на int . Или ако вече е int , променете го на bigint .

Друго възможно решение би било да нулирате IDENTITY семена на по-ниска стойност. Това ще работи само ако или сте изтрили много редове от таблицата, или ако първоначалната начална стойност е много по-висока от 1 .

Например, ако IDENTITY колоната вече е int , но IDENTITY семето започва от да речем 2,000,000,000 , можете да нулирате IDENTITY начало на 1 , което ще позволи да бъдат вмъкнати още 2 милиарда реда.

Полезни функции

Ето някои функции, които могат да бъдат много полезни при идентифицирането на този проблем:

  • IDENT_CURRENT() – връща последната генерирана стойност на идентичност за определена таблица или изглед в колона за идентичност.
  • @@IDENTITY – Връща последно въведената стойност на самоличността в текущата сесия.
  • IDENT_SEED() – Връща оригиналното начало на колона за идентичност.
  • IDENT_INCR() – Връща стойността на увеличение на колона за идентичност.

Също така, ето 3 начина да получите типа данни на колоната, в случай че не сте сигурни какъв е типът данни на колоната.

Една и съща грешка в различни сценарии

Същата грешка (Msg 8115) може да възникне (с малко по-различно съобщение за грешка), когато се опитате да преобразувате изрично между типове данни и оригиналната стойност е извън обхвата на новия тип. Вижте Коригиране на „Грешка при аритметично препълване при преобразуване int в числови тип данни“ в SQL Server, за да коригирате това.

Може да възникне и когато използвате функция като SUM() върху колона и изчислението води до стойност, която е извън диапазона на типа на колоната. Вижте Коригиране на „Грешка при аритметично препълване при преобразуване на израз в тип данни int“ в SQL Server, за да коригирате това.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на редове в таблица само с една колона IDENTITY

  2. Кога да използвате клъстерни или неклъстерни индекси в SQL Server

  3. Как да актуализирате редове с произволна дата

  4. SQL - Разлика между COALESCE и ISNULL?

  5. Как да инсталирате SQL Server на Windows