在 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 代表商品的当前价格。
我在执行时遇到这个错误 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 代表商品的当前价格。