如何实现PK和FK的密钥?

时间:2018-04-20 12:03:38

标签: sql

我是SQL的新手,只是通过阅读过去的论文来练习我的SQL考试,但是,我仍然坚持如何实现staffID& projNo在分配表中既是主键又是外键。我试过在网上使用解决方案但没有工作。

以下是关系架构( PK FK

staff( **staffID**, firstname, lastName, gender, dob, jobTitle)

project ( **projNo**, projName, description )

allocation ( ***staffID***, ***projNo***, hours )

这是我的SQL:

CREATE TABLE staff (
  staffID CHAR (4) PRIMARY KEY,
  firstName VARCHAR (30) NOT NULL,
  lastName VARCHAR (30) NOT NULL,
  gender CHAR (1) CHECK (gender IN ('M','F'))
  dob DATE NOT NULL,
  jobTitle VARCHAR (30) NOT NULL,
  );


CREATE TABLE project (
  projNo CHAR (4) PRIMARY KEY,
  projName VARCHAR (20) NOT NULL,
  description VARCHAR (30) NOT NULL,
  );


CREATE TABLE allocation (
  staffID CHAR (4) 
  projNo CHAR (4) 
  hours int (2)
  );

3 个答案:

答案 0 :(得分:0)

使两列具有主键约束使用;

更改表table_name添加MyPrimaryConstraint主键(列);

答案 1 :(得分:0)

真的没什么了:

CREATE TABLE allocation (
  staffID CHAR (4)
    CONSTRAINT ALLOCATION_FK1
      REFERENCES STAFF(STAFFID)
        ON DELETE CASCADE,
  projNo CHAR (4) 
    CONSTRAINT ALLOCATION_FK2
      REFERENCES PROJECT(PROJNO)
        ON DELETE CASCADE,
  hours int (2),
  CONSTRAINT PK_ALLOCATION
    PRIMARY KEY (STAFFID, PROJNO)
      USING INDEX
  );

CREATE INDEX ALLOCATION_1
  ON ALLOCATION (STAFFID);

CREATE INDEX ALLOCATION_2
  ON ALLOCATION (PROJNO);

这里我已经将外键约束定义为列定义的一部分,但除了方便之外没有其他理由这样做;如果你选择的话,你可以使它们成为外线约束。因为主键由多个列组成,所以必须使其成为一个外部约束,如下所示。

我还在两个外键上定义了索引。这很重要 - 如果不这样做,将从父表中删除性能。

祝你好运。

答案 2 :(得分:0)

您可以为这两列的staffID CHAR(4),projNo CHAR(4)设置组合键。然后像往常一样添加外键。

CREATE TABLE [allocation](
    [staffID] [char](4) NOT NULL,
    [projNo] [char](4) NOT NULL,
    [hours] [int] NULL,
 CONSTRAINT [PK_allocation] PRIMARY KEY CLUSTERED 
(
    [staffID] ASC,
    [projNo] ASC
)) 

然后在alter command

的帮助下设置外键
ALTER TABLE [dbo].[allocation]  WITH CHECK ADD  CONSTRAINT [FK_allocation_project] FOREIGN KEY([projNo])
REFERENCES [dbo].[project] ([projNo])
GO
ALTER TABLE [dbo].[allocation] CHECK CONSTRAINT [FK_allocation_project]
GO

ALTER TABLE [dbo].[allocation]  WITH CHECK ADD  CONSTRAINT [FK_allocation_staff] FOREIGN KEY([staffID])
REFERENCES [dbo].[staff] ([staffID])
GO
ALTER TABLE [dbo].[allocation] CHECK CONSTRAINT [FK_allocation_staff]
GO