Sql 如何将密钥同时实现为PK和FK?

Sql 如何将密钥同时实现为PK和FK?,sql,Sql,我对SQL非常陌生,只是通过阅读过去的论文来练习SQL考试,但是,我一直在研究如何将分配表中的staffID和projNo实现为主键和外键。我曾尝试使用在线解决方案,但都不起作用 这是关系模式(PK,FK) 以下是我的SQL: CREATE TABLE staff ( staffID CHAR (4) PRIMARY KEY, firstName VARCHAR (30) NOT NULL, lastName VARCHAR (30) NOT NULL, gender CHAR

我对SQL非常陌生,只是通过阅读过去的论文来练习SQL考试,但是,我一直在研究如何将分配表中的staffID和projNo实现为主键和外键。我曾尝试使用在线解决方案,但都不起作用

这是关系模式(PK,FK)

以下是我的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)
  );

使两列具有主键约束使用


Alter table_name Add MyPrimaryConstraint主键(列)

其实没什么大不了的:

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);
在这里,我将外键约束定义为列定义的一部分,但这样做除了方便之外没有其他理由;如果您愿意,您可以使它们脱离直线约束。由于主键由多列组成,因此必须使其成为一个越界约束,如图所示

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


祝您好运。

您可以为这两列设置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命令的帮助下设置外键

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

请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加您实际使用的数据库的标记,并向我们展示您对fk和pk的尝试!不相关,但是:
char
几乎总是错误的选择(对于任何超过1个字符的字符)
varchar
从来都不差,但几乎总是更好。
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