为具有不同数据类型的列添加关系

时间:2012-07-03 10:26:42

标签: sql-server sql-server-2008 relationship table-relationships

我的数据库中有2个表,主表有一个名为“ID”的字段,带有“uniqueidentifier”数据类型,详细表有一个名为“MID”的字段,带有“nvarchar”数据类型,我存储主表字段其中的“ID”值

我想在这些表之间添加主 - 详细信息关系,但是当我想要做的时候,会显示一条消息:“列的”以下数据类型属性“...”与“...”的列不匹配“

我不可能将“MID”数据类型设置为“uniquidentifier”!

在MS-Access中可以做到,但我怎样才能在MS-SQLServer 2008中做到这一点?!

之前感谢...

2 个答案:

答案 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))

希望这有帮助。