簡體   English   中英

如何用不是主鍵的另一個表的列來驗證列的值

[英]how to validate values of a column with column of another table which is not a primary key

我有一個表DRIVER其中的列具有以下規范BranchPostedAt int not null

在另一個表中。 CompanyBranch ,我有以下列BranchId int not null

在第二個表中。 CompanyBranch ,主鍵設置為兩列,如下所示

CompanyId  int not null
BranchId   int not null

有沒有什么辦法讓我可以設置一個外國參考鍵dbo.Driver.BranchPostedId引用dbo.CompanyBranch.BranchId創造的時間dbo.Driver

有什么幫助嗎?

不,不可能。 若要創建外鍵,您在另一個表中“引用”的鍵必須是UNIQUE或PRIMARY KEY約束。

您可以考慮以下幾種選擇:

  1. 使CompanyBranch表中的BranchId為唯一
  2. 在CompanyBranch-CompanyBranchId中創建一個新的PRIMARY KEY,並在Driver表中引用它

一種替代方法是創建一個觸發器 ,但這有點混亂。 我更喜歡以前的張貼者答案,以便在CompanyBranch [CompanyBranchId]上創建一個新的相同主鍵,並將其作為外鍵引用。

就像是:

CREATE TRIGGER trDriver
   ON  DRIVER
   AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF NOT EXISTS(Select * 
              from CompanyBranch cb
              Inner join inserted i on i.BranchPostedAt = cb.BranchId )
    BEGIN
        RAISERROR ('The BranchPostedAt is not in the CompanyBranch table.', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN
    END

END
GO

根據您的問題和評論,這就是您所擁有的

TABLE dbo.CityMaster
    CityId INT NOT NULL PRIMARY KEY,

TABLE dbo.CompanyBranch
    CompanyID INT NOT NULL,
    BranchID INT NOT NULL REFERENCES dbo.CityMaster(CityId),
    CONSTRAINT PK... PRIMARY KEY (CompanyID,BranchID)

TABLE dbo.DRIVER
    BranchPostedAt INT NOT NULL,

現在,由於BranchID引用CityMaster.City列, BranchID不是unique在列dbo.CompanyBranch ,您不能使用BranchID作為你的外鍵引用DRIVER.BranchPostedAt

選項1

您應該使用dbo.CityMaster ,其中包含將存儲在DRIVER.BranchPostedAt中的值的主列表。

選項2

如果要dbo.CompanyBranch ,則必須創建一個新的唯一列(您甚至可以使用identity列使其透明)可能是CompanyBranchID (除了現有的組合鍵之外),並將其用作外鍵引用。 您現有的組合鍵無法原樣使用。

僅當您擁有多個公司時,擁有CompanyBranch表才有意義,而且公司之間可能會共享分支機構,否則就不需要該表。 您剛剛有了Company和Branch Table,並且Branch Table中的BranchID是唯一的,並且Branch Table Too中也有一個外鍵CompanyID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM