Добавить взаимосвязь для столбцов с разными типами данных

Вопрос: У меня есть 2 таблицы в моей базе данных, у главной таблицы есть поле с именем "ID" с типом данных "uniqueidentifier", в "Подробной таблице" есть поле "MID" с типом данных "nvarchar", в котором я храню поле "ID" главной таблицы, значение в нем Я хочу добавить отношения между деталями между этими таблицами, но когда я

Вопрос:

У меня есть 2 таблицы в моей базе данных, у главной таблицы есть поле с именем “ID” с типом данных “uniqueidentifier”, в “Подробной таблице” есть поле “MID” с типом данных “nvarchar”, в котором я храню поле “ID” главной таблицы, значение в нем

Я хочу добавить отношения между деталями между этими таблицами, но когда я хочу это сделать, в сообщении говорится: “Следующие свойства типов данных столбца”…”не соответствуют столбцам”…””

Невозможно, чтобы я установил тип данных “MID” в “uniquidentifier”!

в MS-Access это можно сделать, но как я могу это сделать в MS-SQLServer 2008?!

спасибо прежде…

Ответ №1

Вы не можете сделать это легко, так как в SQL Server типы данных столбцов должны соответствовать внешнему ключу, который будет создан. Однако существует (довольно неприятное и сложное) обходное решение. Вы можете создать внешний ключ в SQL Server для любого столбца с ограничением UNIQUE. Таким образом, вы можете выполнить следующие действия:

Опция 1

(Лучше, как было предложено в комментариях)

ALTER TABLE dbo.Table1 ADD ID_Text AS CAST(ID AS varchar(36)) PERSISTED UNIQUE GO

Затем вы можете установить внешний ключ в этот столбец.

Вариант 2

(Мое оригинальное, менее хорошее)

ALTER TABLE dbo.Table1 ADD ID_Text varchar(36) NULL GO UPDATE dbo.Table1 SET ID_Text = CAST(ID AS varchar(36)) GO ALTER TABLE dbo.Table1 ALTER COLUMN ID_Text varchar(36) NOT NULL GO ALTER TABLE dbo.Table1 ADD CONSTRAINT U_ID_Text UNIQUE (ID_Text) GO

Затем, чтобы убедиться, что ID_Text остается заполненным, вам понадобится триггер INSTEAD OF для вставок:

CREATE TRIGGER TI_Table1_ID_Text ON dbo.Table1 INSTEAD OF INSERT AS SET NOCOUNT ON INSERT dbo.Table1 (ID, ID_Text, OtherFields) SELECT ID, CAST(ID AS varchar(36)), OtherFields FROM inserted SET NOCOUNT OFF GO

Здесь замените OtherFields… er… вашими другими полями.

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

Ответ №2

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

CREATE FUNCTION udf_CheckCustomConstraint ( @ForeignKeyValue nvarchar ) RETURNS bit AS BEGIN DECLARE @Result bit SELECT @Result = CONVERT(bit, COUNT(*)) FROM MasterTable WHERE ID = @ForeignKeyValue RETURN @Result END

Затем создайте ограничение для таблицы внешнего ключа.

ALTER TABLE [DetailTable] ADD CONSTRAINT [ConstraintName] CHECK ([udf_CheckCustomConstraint]([MID])=(1))

Надеюсь это поможет.

Оцените статью
Добавить комментарий