我们正在创造一个数字化的'厨房,可以添加哪些物品放在冰箱,冰柜等中。然后就可以在网络应用程序中查看这些物品,这样您就可以随时了解厨房里的杂货。
总共有三张桌子。
解释
这包含这些列表的ListID和名称,例如' Fridge'或者'冷冻机'。所以,这基本上就是'容器'。
项
然后有项目,其中包含1种加仑牛奶的商品类型。
listItems中
然后有 ListItems (抱歉有点混淆的名字),其中包含特定的项目。虽然 Items 只是一个可以添加的项目表,但 ListItems 是添加的项目。因此,添加到此表中的行自然具有列表表上的 List 和指向 Item 的外键的外键。 项表。该表的主键是一个超级键,由几乎所有属性组成。
两个ListItem可以引用相同的 Item 和相同的 List ,只要它们具有不同的属性即可。它们可能在不同日期到期或不同的单位大小。唯一能使 Item 唯一的是名称,就像你添加了一个' Ham'一样,它永远不会覆盖' Milk'。添加另一个' Milk'然后会被视为相同的项
这是一个例子。您想要添加两个单独的项目。第一个是3个火腿,每个200克,于5月28日到期。 接下来是另一个火腿,这个单一,但500克,并在5月31日到期:
ListID 1指的是名为Fridge的 List 。 ItemID 1指的是名为 Ham 的项目。
看到问题?外键是相同的。
它在我们的本地数据库中存储得很好,但在与Azure数据库同步时,我们收到以下错误:
{"Violation of PRIMARY KEY constraint 'PK__#A4D1762__44A4C03D49E5E4B8'.
Cannot insert duplicate key in object 'dbo.@changeTable'.
The duplicate key value is (1, 1).\r\n
The data for table-valued parameter \"@changeTable\" doesn't conform to the table type of the parameter.
SQL Server error is: 3602, state: 30\r\nThe statement has been terminated."}
这是一个糟糕的数据库设计还是Azure问题?
以下是DDL在本地数据库中的显示方式:
CREATE TABLE [dbo].[ListItems] (
[ListId] INT NOT NULL,
[ItemId] INT NOT NULL,
[Amount] INT NOT NULL,
[Volume] INT NOT NULL,
[Unit] NVARCHAR(MAX) NULL,
[ShelfLife] DATETIME NOT NULL,
CONSTRAINT [pk_ListItems] PRIMARY KEY CLUSTERED ([ShelfLife], [Volume], [Amount], [ItemId], [ListId]),
CONSTRAINT [fk_ListItems] FOREIGN KEY ([ListId]) REFERENCES [dbo].[Lists] ([ListId]) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT [fk_ListItems2] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[Items] ([ItemId]) ON DELETE CASCADE ON UPDATE CASCADE
);
Azure数据库DDL:
CREATE TABLE [dbo].[ListItems] (
[ListId] INT NOT NULL,
[ItemId] INT NOT NULL,
[Amount] INT NOT NULL,
[Volume] INT NOT NULL,
[Unit] NVARCHAR (MAX) NULL,
[ShelfLife] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.ListItems] PRIMARY KEY CLUSTERED ([ListId] ASC, [ItemId] ASC, [Amount] ASC, [Volume] ASC, [ShelfLife] ASC),
CONSTRAINT [FK_dbo.ListItems_dbo.Items_ItemId] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[Items] ([ItemId]) ON DELETE CASCADE,
CONSTRAINT [FK_dbo.ListItems_dbo.Lists_ListId] FOREIGN KEY ([ListId]) REFERENCES [dbo].[Lists] ([ListId]) ON DELETE CASCADE
);
PK CONSTRAINT行略有不同,但属性相同。这可能是问题吗?
答案 0 :(得分:1)
我不认为错误是您认为的错误。如果本地和Azure ListItems上的PK都命名相同的列(无论顺序如何),它们都是相同的。但是,错误消息提到了不同的PK定义(和不同的表名):
Violation of PRIMARY KEY constraint 'PK__#A4D1762__44A4C03D49E5E4B8'. Cannot insert duplicate key in object 'dbo.@changeTable'. The duplicate key value is (1, 1).
似乎有一个名为" @ changetable" - 看起来像我的商店过程参数 - 用两列主键定义。追踪它,你将解决问题。