我有一个表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
设置外国参考密钥?
任何帮助?
答案 0 :(得分:1)
不,这是不可能的。要创建外键,您要引用的密钥是"在另一个表中必须是UNIQUE或PRIMARY KEY约束。
您可以考虑几个选项:
答案 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)