如何使用另一个不是主键的表的列来验证列的值

时间:2015-04-28 10:26:06

标签: sql sql-server

我有一个表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设置外国参考密钥?

任何帮助?

4 个答案:

答案 0 :(得分:1)

不,这是不可能的。要创建外键,您要引用的密钥是"在另一个表中必须是UNIQUE或PRIMARY KEY约束。

您可以考虑几个选项:

  1. 将CompanyBranch表中的BranchId设为唯一
  2. 在CompanyBranch中创建一个新的PRIMARY KEY - CompanyBranchId,和 在你的驱动程序表中引用它

答案 1 :(得分:1)

替代方案是create a trigger,但这有点凌乱。我更喜欢以前的海报回答在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

答案 2 :(得分:1)

根据您的问题和评论,这就是您所拥有的

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(除了var MongoClient = require('mongodb').MongoClient , Db = require('mongodb').Db , Server = require('mongodb').Server , ObjectID = require('mongodb').ObjectID; var db = new Db('testing', new Server('localhost', 27017)); db.open(function(err, db){ var Users = db.collection('users'); Users.find({code : {$exists : false} }, {email : 1}, function(err, users){ users.forEach(function(user){ var code = generateCode(); var userID = user._id; Users.update({ _id : user._id }, {$set : {code : code } }, function(err, results){ if (err) console.log(err); else console.log(results); }); }); }); 您现有的复合键)并将其用作外键引用。您现有的复合键不能按原样使用。

答案 3 :(得分:0)

如果您拥有多家公司,并且公司可能会彼此共享分支机构,那么只有CompanyBranch表是有意义的,否则您不需要这样的表。您刚刚拥有公司和分支表,并且在分支表中,BranchID是唯一的,并且您在分支表中也有外键CompanyID。