我的数据库中有2个表,主表有一个名为“ID”的字段,带有“uniqueidentifier”数据类型,详细表有一个名为“MID”的字段,带有“nvarchar”数据类型,我存储主表字段其中的“ID”值
我想在这些表之间添加主 - 详细信息关系,但是当我想要做的时候,会显示一条消息:“列的”以下数据类型属性“...”与“...”的列不匹配“
我不可能将“MID”数据类型设置为“uniquidentifier”!
在MS-Access中可以做到,但我怎样才能在MS-SQLServer 2008中做到这一点?!之前感谢...
答案 0 :(得分:2)
您无法轻松完成此操作,因为在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
替换为......呃......您的其他字段。
然后,除了可以从ID_Text
列创建外键之外,您可以忘记新的MID
字段。
答案 1 :(得分:1)
您可以创建自定义约束。首先,创建一个检查约束的函数。
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))
希望这有帮助。