在 visual studio sql 中创建表

creating tables in visual studio sql

我在执行时遇到这个错误 SQL71516 :: 引用的 table '[dbo].[Stock]' 不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,则应该持久化。

CREATE TABLE [dbo].[Customer]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY, 
[FirstName] NCHAR(10) NOT NULL, 
[LastName] NCHAR(10) NOT NULL, 
[Email] NCHAR(10) NOT NULL UNIQUE, 
[Mobile] NCHAR(10) NOT NULL

)

CREATE TABLE [dbo].[Stock]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY, 
[name] NCHAR(10) NOT NULL, 
[price] INT NOT NULL,
CustomersID int NOT NULL,
FOREIGN KEY (CustomersID) REFERENCES Customer(Id)
ON DELETE CASCADE ON UPDATE CASCADE
)

CREATE TABLE [dbo].[Order]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY, 
[Date] DATE NOT NULL, 
[Quantity] INT NOT NULL,  
Stock_price int NOT NULL,
[Total Value] AS (Quantity)*(Stock_price) PERSISTED, 
CONSTRAINT [FK_Stock_price1] FOREIGN KEY ([Stock_price])
REFERENCES [Stock](price) ON DELETE CASCADE ON UPDATE CASCADE
)

[Stock].[price] 不是键,这就是您不能在该列上定义外键的原因。

如果 table Stock 中的 2 个产品(A 和 B)具有相同的 price,参考是什么?

您可以在此列上设置一个键,例如 UNIQUE,但这会阻止您在 table Stock.

中使用不同的价格

我建议您使用 [Stock].[Id] 键作为外键的参考,例如:

CREATE TABLE [dbo].[Order]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, 
    [Date] DATE NOT NULL, 
    [Quantity] INT NOT NULL,  
    Stock_id int NOT NULL, -- <--- changed column name
    [Total Value] AS (Quantity)*(Stock_price) PERSISTED, 
    CONSTRAINT [FK_Stock_id1] FOREIGN KEY ([Stock_id]) -- <-- changed column name
    REFERENCES [Stock](Id) ON DELETE CASCADE ON UPDATE CASCADE
    --                ^--^------------------------------------- Notice this
);

您只能使用具有唯一索引的列。 price 列不是。但是,我怀疑给你带来困难的外键实际上是错误的。我也不认为你的 Stock table 中应该有 CustomerId 参考。

事实上,商店的基本标准数据库结构是这样的:

Customer table
    id, name [, other details]

Stock table
    id, name, price [, other details]

Order table
    id, customer id, order date [, other details]

Order details table
    id, order id, item id, quantity, price [, other details]

这样,一个订单与单个客户相关,可以包含多个项目。
订单详情中的价格栏 table 代表订单日期的商品价格 - 而库存中的价格栏 table 代表商品的当前价格。