@serj37

Как обеспечить уникальность данных в таблице?

Добрый день!
Создаю табличку:
CREATE TABLE dic
( dic_id BIGINT NOT NULL IDENTITY,
dic_value VARCHAR(MAX) NOT NULL )
CREATE UNIQUE INDEX PK_dic_id ON dic (dic_id) INCLUDE (dic_value)
GO
Но, вопреки логики, в столбце dic_value оказывается много дублей (не уникальные значения).
Что я делаю не так?
  • Вопрос задан
  • 1146 просмотров
Решения вопроса 2
@Sumor
CREATE UNIQUE INDEX PK_dic_id ON dic (dic_id) INCLUDE (dic_value)

Этой командой вы создаёте уникальный индекс по полю dic_id. И уникальность обеспечивается только по этому полю. Поле dic_value включается в индекс дополнительно, для того, чтобы быстрее выполнять SELECT, в котором участвуют только эти поля.
CONSTRAINT PK_dic_id PRIMARY KEY (dic_id, dic_value))

Создаёт уникальный индекс с двумя полями, то есть уникальность обеспечивается на пару полей в совокупности. так как dic_id у вас уникальный, то уникальность обеспечивается независимо от значения dic_value.

Правильно создать отдельный уникальный индекс на dic_value:
CREATE UNIQUE INDEX IX_dic_value ON dic (dic_value)
Ответ написан
Комментировать
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
dic_value VARCHAR(MAX)
Вы не сможете сделать ограничение уникальности на это поле. Создайте вычисляемое поле, например, хеш и ограничивайте его.
CREATE TABLE [dbo].[Dic](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Value] [varchar](max) NOT NULL,
	[ValueUnique]  AS (hashbytes('MD5',[Value])),
 CONSTRAINT [PK_Dic] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_Dic] ON [dbo].[Dic]
(
	[ValueUnique] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
VladimirAndreev
@VladimirAndreev
php web dev
Свойство идентификаторов столбца не гарантирует следующее.
Уникальность значения — уникальность значения следует обеспечить с помощью ограничения PRIMARY KEY или UNIQUE либо индекса UNIQUE
.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы