我在我的數據庫中有2個表,主表中有一個名爲「ID」的字段,其中包含「uniqueidentifier」數據類型,詳細信息表中有一個名爲「MID」的字段,其中包含「nvarchar」數據 - 我存儲的類型主表字段「ID」值其中爲不同數據類型的列添加關係
我想添加這些表之間的主 - ...「不匹配那些」...「的列」
我不可能將「MID」數據類型設置爲「唯一標識符」!
MS-Access可以做,但我怎麼能在MS-SQLServer 2008中做到這一點?
感謝前...
我在我的數據庫中有2個表,主表中有一個名爲「ID」的字段,其中包含「uniqueidentifier」數據類型,詳細信息表中有一個名爲「MID」的字段,其中包含「nvarchar」數據 - 我存儲的類型主表字段「ID」值其中爲不同數據類型的列添加關係
我想添加這些表之間的主 - ...「不匹配那些」...「的列」
我不可能將「MID」數據類型設置爲「唯一標識符」!
MS-Access可以做,但我怎麼能在MS-SQLServer 2008中做到這一點?
感謝前...
你不能做到這一點很容易,如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
列創建一個外鍵給它。
更好的方法是將新列作爲計算列。然後他不需要玩弄INSTEAD OF觸發器。 – user1429080
您無法創建計算列的外鍵。 –
如果計算列設置正確,您可以:_not nullable_,_unique_和_persisted_。經測試,它工作(Sql server 2008) – user1429080
您可以創建自定義約束。首先,創建一個檢查約束的函數。
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))
希望這會有所幫助。
請將您的表格定義爲兩個CREATE TABLE語句。當我們看到代碼時,幫助更容易。 –
@isme:沒有代碼!,我在SQL Server Managment Studio中使用表設計器執行此操作 –
始終存在代碼。桌子設計師只是把你藏起來。在對象資源管理器中查找每個表格,右鍵單擊並選擇「腳本表格爲>創建到>新建查詢編輯器窗口」。將每個表的腳本複製到您的問題中。 –