Вопрос:
У меня есть 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))
Надеюсь это поможет.