MS SQL таблица с GUID все нули - PullRequest
       17

MS SQL таблица с GUID все нули

0 голосов
/ 13 февраля 2019

Я унаследовал веб-приложение, в котором одна из внутренних таблиц MS SQL имеет поле с:

Разрешить пустые значения = Нет, DataType = uniqueidentifier, DefaultValue = newid (), Сжатые данные = Тип uniqueidentifier

Из многих тысяч строк в некоторых есть все нули для GUID.Это не устаревшие данные, поскольку некоторые из них имеют последние даты создания.

Почему SQL-сервер не вводит правильный GUID в это поле, когда приложение создает новую запись?

РЕДАКТИРОВАТЬ: Контекст EF для этого поля имеет это:

entity.Property(e => e.ThreadId).HasDefaultValueSql("newid()");

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

тип данных uniqueidentifier не означает, что он будет уникальным.Если вы генерируете NEWID(), тогда он генерирует уникальный идентификатор, но опять же всегда существует вероятность того, что этот идентификатор может быть сгенерирован.

Для 0 *

insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values (newid());

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


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

create table t (
  id uniqueidentifier unique
  CONSTRAINT CHK_uid CHECK (id != '00000000-0000-0000-0000-000000000000')
);
GO
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values ('00000000-0000-0000-0000-000000000000');
insert into t values (newid());
GO
Msg 547 Level 16 State 0 Line 1
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 547 Level 16 State 0 Line 2
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 547 Level 16 State 0 Line 3
The INSERT statement conflicted with the CHECK constraint "CHK_uid". The conflict occurred in database "fiddle_80c5a5fe96ab4e73ac5dafbb2256025d", table "dbo.t", column 'id'.
Msg 3621 Level 0 State 0 Line 1
The statement has been terminated.
Msg 3621 Level 0 State 0 Line 2
The statement has been terminated.
Msg 3621 Level 0 State 0 Line 3
The statement has been terminated.
select * from t
GO
| id                                   |
| :----------------------------------- |
| ddeb79f6-dc0f-4c6a-a065-2083d39a78c1 |

дБ <> скрипка здесь

0 голосов
/ 13 февраля 2019

Если столбец SQL обнуляем, значит, проблема в вашем коде C #.Убедитесь, что классы POCO также используют обнуляемый Guid.Также убедитесь, что вы инициализируете свойство при создании новых экземпляров.По умолчанию в C # для необнуляемого Guid используется нулевой Guid.Если проблема существует только со старыми данными, возможно, код уже исправлен.

...