1

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

我想在这些表之间添加主从关系,但是当我想做时,一条消息说:“列“...”的以下数据类型属性与“...”的列不匹配”

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

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

之前谢谢...

4

2 回答 2

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为 ... er ... 您的其他字段。

ID_Text然后,除了可以从列创建外键之外,您可以忘记新字段MID

于 2012-07-03T12:12:28.857 回答
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))

希望这可以帮助。

于 2012-07-03T12:31:50.040 回答