【问题标题】:How do I create a table with a primary key using two foreign keys?如何使用两个外键创建具有主键的表?
【发布时间】:2021-12-30 19:21:07
【问题描述】:

我有两张桌子:

表 1

idproduct (PK)

des_product

表2

idclient (PK)

des_client

我需要创建一个这样的表:

Table3

idproduct (FK)(PK)

idclient (FK)(PK)

des_anything

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    使用“out-of-line constraint”语法:

    CREATE TABLE T3 (
      idproduct INT NOT NULL REFERENCES t1(idproduct),  -- in-line FK syntax
      idclient INT NOT NULL REFERENCES t2(idclient),
      anyt_other_column VARCHAR(10),
      PRIMARY KEY(idproduct, idclient)   -- out-of-line PK syntax
    );
    

    具有命名约束的更健壮的语法:

    CREATE TABLE T3 (
      idproduct INT NOT NULL,
      idclient INT NOT NULL,
      anyt_other_column VARCHAR(10),
      CONSTRAINT PK_T3    PRIMARY KEY (idproduct, idclient),
      CONSTRAINT FK_T3_T1 FOREIGN KEY (idproduct) REFERENCES t1(idproduct),
      CONSTRAINT FK_T3_T2 FOREIGN KEY (idclient) REFERENCES t2(idclient)
    );
    

    db<>fiddle demo

    【讨论】:

    • Idclient 也应该有一个索引来支持 FK。
    【解决方案2】:

    这里是一个带有级联删除的实体框架完整示例:

    CREATE TABLE [dbo].[Table3](
        [idproduct] [int] NOT NULL,
        [idclient] [int] NOT NULL,
        -- other fields
        -- [des_anything] ....
    CONSTRAINT [PK_Table3] PRIMARY KEY CLUSTERED 
    (
        [idproduct] ASC,
        [idclient] ASC
    ) ON [PRIMARY]
    
    CREATE NONCLUSTERED INDEX [IX_Table3_idclient] ON [dbo].[Table3]
    (
        [idclient] ASC
    ) ON [PRIMARY]
    
    ALTER TABLE [dbo].[Table3]  WITH CHECK ADD  CONSTRAINT [FK_Table3_Table1_idproduct] FOREIGN KEY([idproduct])
    REFERENCES [dbo].[Table1] ([idproduct])
    ON DELETE CASCADE
    
    ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table1_idproduct]
    
    ALTER TABLE [dbo].[Table3]  WITH CHECK ADD  CONSTRAINT [FK_Table3_Table2_idclient] FOREIGN KEY([idclient])
    REFERENCES [dbo].[Table2] ([idclient])
    ON DELETE CASCADE
    
    ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table2_idclient]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多