1

我在我的數據庫中有2個表,主表中有一個名爲「ID」的字段,其中包含「uniqueidentifier」數據類型,詳細信息表中有一個名爲「MID」的字段,其中包含「nvarchar」數據 - 我存儲的類型主表字段「ID」值其中爲不同數據類型的列添加關係

我想添加這些表之間的主 - ...「不匹配那些」...「的列」

我不可能將「MID」數據類型設置爲「唯一標識符」!

MS-Access可以做,但我怎麼能在MS-SQLServer 2008中做到這一點?

感謝前...

+1

請將您的表格定義爲兩個CREATE TABLE語句。當我們看到代碼時,幫助更容易。 –

+0

@isme:沒有代碼!,我在SQL Server Managment Studio中使用表設計器執行此操作 –

+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替換爲...呃...您的其他領域。

然後,您可以忘記新的ID_Text字段,因爲您可以從MID列創建一個外鍵給它。

+1

更好的方法是將新列作爲計算列。然後他不需要玩弄INSTEAD OF觸發器。 – user1429080

+0

您無法創建計算列的外鍵。 –

+1

如果計算列設置正確,您可以:_not nullable_,_unique_和_persisted_。經測試,它工作(Sql server 2008) – user1429080

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

希望這會有所幫助。