一个值可以同时作为主键和外键吗?

3

我在我的SQL Server数据库中有以下表格。

客户是用户的子类型,因此我从客户到用户建立了一个引用关系。

我还想将我的客户链接到我的预订。我想使用客户表中的外键作为此关系的主键。当我在SQL Server中编写此内容时,在“(userid)”下面出现了如下错误:

无效列 'userid'

我该如何建立这个关系?

Create table [dbo].[User]
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL,
    [name] varchar(50) NOT NULL,
    [password] nvarchar(100) NOT NULL, 
)

Create table [dbo].[Customer]
(
    [userid] int FOREIGN KEY REFERENCES [dbo].[User](id) NOT NULL,
    [street] varchar(40) NOT NULL,
    [housenumber] varchar(10) NOT NULL,
    [postalcode] varchar(10) NOT NULL,
    [phonenumber] varchar(20) NOT NULL,
    [email] varchar(30) NOT NULL,
)

Create table [dbo].[Reservation]
(
    [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL,
    [datum] date NOT NULL,
    [prijs] decimal NOT NULL,
    [levertijd] datetime NOT NULL,
    [ophaaltijd] datetime NOT NULL,
    [leverAdres] varchar(60) NOT NULL,
    [klantId] int FOREIGN KEY REFERENCES [dbo].[Customer](userid) NOT NULL
)

3
答案是肯定的。但是 [dbo].Customer 必须是一个键(主键或唯一约束)。 - jarlh
在当前结构中,您必须使用id作为[dbo].[Customer]的外键。 - Yogesh Sharma
像这样 http://rextester.com/III59459 - Martin Smith
1个回答

0
是的,这是可能的,请尝试像这样进行。
Create table [dbo].[Customer]
(
  [userid] int not null,
  [street] varchar(40) NOT NULL,
  [housenumber] varchar(10) NOT NULL,
  [postalcode] varchar(10) NOT NULL,
  [phonenumber] varchar(20) NOT NULL,
  [email] varchar(30) NOT NULL,

  constraint PK_UserID primary key ([userid]),
  constraint FK_Customer_User foreign key (userid) references [User] (id)
)

但是我必须说,userid 作为一个名为 Customer 的表的主键似乎有些奇怪。

我会做类似这样的事情:

Create table [dbo].[Customer]
(
  [CustomerID] int not null identity,
  [userid] int not null,
  [street] varchar(40) NOT NULL,
  [housenumber] varchar(10) NOT NULL,
  [postalcode] varchar(10) NOT NULL,
  [phonenumber] varchar(20) NOT NULL,
  [email] varchar(30) NOT NULL,

  constraint PK_CustomerID primary key ([CustomerID]),
  constraint FK_Customer_User foreign key (userid) references [User] (id)
)


Create table [dbo].[Reservation]
(
  [id] int PRIMARY KEY IDENTITY (1,1) NOT NULL,
  [datum] date NOT NULL,
  [prijs] decimal NOT NULL,
  [levertijd] datetime NOT NULL,
  [ophaaltijd] datetime NOT NULL,
  [leverAdres] varchar(60) NOT NULL,
  [klantId] int FOREIGN KEY REFERENCES [dbo].[Customer](customerid) NOT NULL

)


这个可行,谢谢。我同意这是一个奇怪的名称,但我认为在同一张表中同时拥有CustomerID和UserID会产生重复数据,因为它们具有不同的名称。 - user6229886

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接