用于复合主键的外键

Vin*_*hak 11 sql foreign-keys primary-key

谢谢阅读.

是否可以将复合外键用作表的复合主键的一部分?

例如,假设我有两个表:

            CREATE TABLE DB.dbo.Partners
            (
                CONSTRAINT pk_Partners_Id
                PRIMARY KEY (Name, City, State, Country, PostalCode),

                Name                VARCHAR(100)
                                    NOT NULL,

                Address1            VARCHAR(100),

                Address2            VARCHAR(100),

                Address3            VARCHAR(100),

                City                VARCHAR(150)
                                    NOT NULL,

                State               CHAR(2)
                                    NOT NULL,

                Country             CHAR(2)
                                    NOT NULL,

                PostalCode          VARCHAR(16)
                                    NOT NULL,

                Phone               VARCHAR(20),

                Fax                 VARCHAR(20),

                Email               VARCHAR(256)
            )
Run Code Online (Sandbox Code Playgroud)

...然后在第二个表中,我想在第二个表的主键中引用外键:

            CREATE TABLE DB.dbo.PartnerContacts
            (
                CONSTRAINT pk_PartnerContacts_Id
                PRIMARY KEY (fk_PartnerContacts_PartnerId, FirstName, LastName, PhoneNumber, Email),

                CONSTRAINT fk_PartnerContacts_PartnerId
                FOREIGN KEY REFERENCES Partners(Name, City, State, Country, PostalCode),

                FirstName           VARCHAR(75)
                                    NOT NULL,

                MiddleName          VARCHAR(75),

                LastName            VARCHAR(75)
                                    NOT NULL,

                PhoneNumber         VARCHAR(20)
                                    NOT NULL,

                MobileNumber        VARCHAR(20),

                FaxNumber           VARCHAR(20),

                Email               VARCHAR(256)
                                    NOT NULL,

                MailTo              VARCHAR(100),

                Address1            VARCHAR(100),

                Address2            VARCHAR(100),

                Address3            VARCHAR(100),

                City                VARCHAR(150),

                State               CHAR(2),

                Country             CHAR(2),

                PostalCode          VARCHAR(16)
            )
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做到吗?是的,在这些表中只使用IDENTITY列可能更容易,但如果我可以定义没有IDENTITY的实际关系,我想这样做.

编辑:

我想提供最终的,有效的SQL.感谢所有回答的人!

            CREATE TABLE DB.dbo.Partners
            (
                CONSTRAINT pk_Partners_Id
                PRIMARY KEY (Name, City, State, Country, PostalCode),

                Id                  INT
                                    NOT NULL
                                    UNIQUE
                                    IDENTITY(1, 1),

                Name                VARCHAR(100)
                                    NOT NULL,

                Address1            VARCHAR(100),

                Address2            VARCHAR(100),

                Address3            VARCHAR(100),

                City                VARCHAR(150)
                                    NOT NULL,

                State               CHAR(2)
                                    NOT NULL,

                Country             CHAR(2)
                                    NOT NULL,

                PostalCode          VARCHAR(16)
                                    NOT NULL,

                Phone               VARCHAR(20),

                Fax                 VARCHAR(20),

                Email               VARCHAR(256)
            )

            CREATE TABLE DB.dbo.PartnerContacts
            (
                CONSTRAINT pk_PartnerContacts_Id
                PRIMARY KEY
                (PartnerId, FirstName, LastName, PhoneNumber, Email),

                PartnerId           INT
                                    NOT NULL
                                    CONSTRAINT fk_PartnerContacts_PartnerId
                                    FOREIGN KEY REFERENCES Partners(Id),

                FirstName           VARCHAR(75)
                                    NOT NULL,

                MiddleName          VARCHAR(75),

                LastName            VARCHAR(75)
                                    NOT NULL,

                PhoneNumber         VARCHAR(20)
                                    NOT NULL,

                MobileNumber        VARCHAR(20),

                FaxNumber           VARCHAR(20),

                Email               VARCHAR(256)
                                    NOT NULL,

                MailTo              VARCHAR(100),

                Address1            VARCHAR(100),

                Address2            VARCHAR(100),

                Address3            VARCHAR(100),

                City                VARCHAR(150),

                State               CHAR(2),

                Country             CHAR(2),

                PostalCode          VARCHAR(16)
            )
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Mik*_*ll' 7

您可能需要指定应匹配的列.

CONSTRAINT fk_PartnerContacts_PartnerId
FOREIGN KEY         (columns that correspond to referenced columns) 
 REFERENCES Partners (Name, City, State, Country, PostalCode),
Run Code Online (Sandbox Code Playgroud)

因此,您需要提供五个列名称,其值应与"合作伙伴"表中{Name,City,State,Country,PostalCode}的值相匹配.我很确定你不能用你目前的结构做到这一点.您将无法匹配"名称".我想你正在寻找这些方面的东西.

CREATE TABLE DB.dbo.PartnerContacts (
-- Start with columns that identify "Partner".
    partner_name VARCHAR(100) NOT NULL,
    partner_city VARCHAR(150) NOT NULL,
    partner_state CHAR(2) NOT NULL,
    partner_country CHAR(2) NOT NULL,
    partner_postcode VARCHAR(16) NOT NULL,
    CONSTRAINT fk_PartnerContacts_PartnerId
        FOREIGN KEY (partner_name, partner_city, partner_state, partner_country, partner_postcode) 
        REFERENCES Partners (Name, City, State, Country, PostalCode),
    FirstName    VARCHAR(75) NOT NULL,
    MiddleName   VARCHAR(75),
    LastName     VARCHAR(75) NOT NULL,
    PhoneNumber  VARCHAR(20) NOT NULL,
    MobileNumber VARCHAR(20),
    FaxNumber    VARCHAR(20),
    Email        VARCHAR(256) NOT NULL,
    MailTo       VARCHAR(100),
    Address1     VARCHAR(100),
    Address2     VARCHAR(100),
    Address3     VARCHAR(100),
    City         VARCHAR(150),
    State        CHAR(2),
    Country      CHAR(2),
    PostalCode   VARCHAR(16),
    CONSTRAINT pk_PartnerContacts_Id
    PRIMARY KEY (partner_name, partner_city, partner_state, partner_country, partner_postcode, 
                 FirstName, LastName, PhoneNumber, Email)
);
Run Code Online (Sandbox Code Playgroud)