由于缺少数据类型,无法引用为外键

问题描述 投票:0回答:1

RequestID 没有数据类型,因此我无法将其作为另一个表中的外键。

我遇到了一个错误,因为我在另一个表中将RequestID设置为nvarchar(50),但实际上它在原始表中没有数据类型。

CREATE TABLE [dbo].[RequestList]
(   
[Id] INT IDENTITY (1, 1) NOT NULL,    
[RequestID]  AS  ('R'+right('000'+CONVERT([nvarchar](10),[Id]),(3))) PERSISTED NOT NULL,
Date date,  
CustomerID nvarchar(50) foreign key references CustomerList(CustomerID),    
PRIMARY KEY CLUSTERED ([RequestID] ASC),
)

CREATE TABLE [dbo].[ServiceList]
(   
ServiceID nvarchar(50) primary key, 
ServiceType nvarchar(50),   
Quantity int,   
UnitPrice decimal(10,2),    
TotalPrice decimal(10,2),   
[RequestID] nvarchar(50) foreign key references RequestList([RequestID]) NULL
)

错误,因为 [dbo].[RequestList].[RequestID] 没有数据类型,但我在 [dbo].[ServiceList] 中将其设置为 nvarchar(50)

sql-server t-sql
1个回答
0
投票

计算列的数据类型由 SQL Server 根据用于创建它的表达式确定。来自官方文档

数据库引擎通过将数据类型优先级规则应用于公式中指定的表达式来确定计算列的数据类型。例如,如果公式引用 Money 类型的列和 int 类型的列,则计算列将为 Money 类型,因为该数据类型具有更高的优先级。有关详细信息,请参阅数据类型优先级 (Transact-SQL)

具体来说,在您的情况下,用于计算列的表达式返回

nvarchar(4)
- 所以这就是您应该用于引用它的列的数据类型:

SET QUOTED_IDENTIFIER ON 
CREATE TABLE [dbo].[RequestList]
(   
  [Id] INT IDENTITY (1, 1) NOT NULL,    
  [RequestID]  AS  ('R'+right('000'+CONVERT([nvarchar](10),[Id]),(3))) PERSISTED NOT NULL,
  [Date] date,  
  CustomerID nvarchar(50) foreign key references CustomerList(CustomerID),    
  PRIMARY KEY CLUSTERED ([RequestID] ASC),
)

CREATE TABLE [dbo].[ServiceList]
(   
  ServiceID nvarchar(50) primary key, 
  ServiceType nvarchar(50),   
  Quantity int,   
  UnitPrice decimal(10,2),    
  TotalPrice decimal(10,2),   
  [RequestID] nvarchar(4) foreign key references RequestList([RequestID]) NULL
)

© www.soinside.com 2019 - 2024. All rights reserved.