【问题标题】:SQL Server - Inserting Multiple Values Into ColumnSQL Server - 将多个值插入列
【发布时间】:2018-11-20 15:41:20
【问题描述】:

我正在尝试更新我的比萨饼,以便它可以提供多个浇头。我在尝试向列添加多个 toppingID 时收到错误 Cannot insert duplicate key row in object 'dbo.PizzaToppings' with unique index 'FK_Pizza'. The duplicate key value is (3).。如何添加多个 ToppingID?

INSERT INTO dbo.PizzaToppings
(PizzaToppingsID, PizzaID, ToppingsID)
VALUES 
   (1, 1, 1),
   (2, 2, 2),
   (3, 3, 3),
   (4, 4, 7),
   (5, 5, 6),
   (6, 6, 4),
   (7, 3, 7);

创建的 FK_Pizza

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC
);

【问题讨论】:

  • 您的意思是说您有兴趣将pizzatoppings 作为逗号分隔的字符串存储在ToppingsID 字段中?那样的设计将是一个糟糕的设计。而是存储 PizzaToppingsID 和 ToppingsId 是一个单独的表
  • 你得到什么语法错误?
  • 我想查看索引 FK_Pizza。基本上它说您正在尝试插入一条与索引 FK_Pizza 中提到的其他记录无法区分的记录。您能为我们提供该表的创建语句吗?
  • @Henrov 更新。

标签: sql tsql sql-update


【解决方案1】:

您正在尝试将一个数组存储到一个看起来像数字的列中。

通常每个浇头都有一行:

Pizzas:
PizzaID     integer
PizzaName   varchar(32)

Toppings:
ToppingID   integer
ToppingName varchar(32)

PizzaTopping:
PizzaID     integer (fk to Pizzas.PizzaID)
ToppingID   integer (fk to Toppings.ToppingID)

PizzaTopping 将为每个比萨饼的每个浇头包含一行。

编辑更新的问题:

您的错误归结为重复的密钥违规。检查表上的约束,似乎有一个约束阻止您在每个 pizzaID 中添加多于一行。

【讨论】:

  • 啊,是的,我的问题已经更新。我在尝试这样做时收到此错误。
  • 嗯,好吧,我在问题中添加了我的 FK_Pizza。
【解决方案2】:

每个披萨都必须是独一无二的..... 试试这个:

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC, ToppingsID ASC
);

别忘了先去掉约束

【讨论】:

  • 我必须为我的 FK_Toppings 做同样的事情,但确实有效。谢谢你的帮助:)
【解决方案3】:

为什么这个聚集索引被命名为外键约束?

CREATE UNIQUE NONCLUSTERED INDEX
FK_Pizza
ON PizzaToppings
(
PizzaID ASC
);

它必须是唯一的吗?您的意思是不是只是一个 FK 而不是索引?

您的唯一键不应该是 PizzaToppingID 吗?

您是否允许插入身份?或者你不应该让它成为一个自动递增的 ID 并只插入 PizzaID 和 ToppingID?

此表中是否已经存在 PizzaID = 3 的记录?如果您只想维护或 UPSERT,那么 MERGE 不应该更好吗?

如果这是 Pizza 和 topping 之间的连接表,为了显示哪些 topping 可以用于哪个 Pizza,它不应该有 2 个 FK 和 1 个唯一索引吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多