【问题标题】:Insert to table when surrogate key is being used使用代理键时插入表
【发布时间】:2018-10-28 03:31:37
【问题描述】:

我有两张桌子:

表一是:

  • product_id (INT 11) - PK,自动增量
  • category (INT 11) - 索引,FK 到 Table2.category_id
  • product (VARCHAR 255)

表2是:

  • category_id (INT11) - PK,自动增量
  • category_name (VARCHAR 255)

现在,当向表 1 添加新产品时,我需要 INSERT 类别和产品。但是,category 是一个代理键,它与Table2.category_id 列相关(每个类别都有一个列),这意味着当我插入时,我并不知道category_id,只知道category_name

您知道如何高效地完成这项工作吗?

或者我应该放弃代理键并完全使用自然键吗?

谢谢

【问题讨论】:

  • 我不关注。如果您知道产品所属的类别,那么这里的问题是什么?
  • 我知道类别,但我不知道 category_id(当然,除非我查询 Table2)。并且 Table1 只接受 INT 11,因为它链接到表 2。我不知道 category_id,只是名称。
  • 所以你是说你知道文本category_name,但不知道category_id?这似乎不寻常。通常,您的应用程序(例如 PHP)将在幕后处理 category_id,因此这是可用的。
  • 正是……是吗?我认为设置多个表和使用代理键时这种情况会很常见,但我没有任何经验......你有什么建议来处理它吗?我有很多这样设置的表。
  • 我可以给你一个答案,但我感觉不对。

标签: mysql database insert mariadb


【解决方案1】:

如果你想插入一个新产品,但你只知道category_name,而不知道category_id,那么我们尝试做一个INSERT INTO ... SELECT

INSERT INTO table1 (category, product)
SELECT category_id, 'new product'
FROM table2
WHERE category_name = 'some category';

出于多种原因,这对我来说是糟糕的设计。首先,您的应用程序(例如 PHP)可能会在后台处理 category_id不是 category_name。因此,理想情况下,您不必查询 table2 即可使此插入工作。这里的另一个问题是两个或多个类别可能碰巧具有相同的名称(但不同的category_id)。如果可能,最好直接使用主键。

【讨论】:

  • 现在,这看起来很完美。为什么你会觉得不对劲?我正在用 Python Flask 编程。
  • 我一直在想一个 PHP 应用程序,您可以在其中使用 category_id不是 category_name
  • 我正在用 HTML 设计一个表单,所以在前端,使用的是category_name(不是id)。提交表单时(将INSERT 提交到数据库中),我只有名字...
  • 其实category_name是唯一的,所以第二种情况不是问题...
  • 对...但是假设您为此使用了一个选择框。那么键是category_id,值是category_name。也就是说,您已经在 UI 端拥有category_id。也许出于某种原因,这对您的 UI 来说是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2019-04-13
  • 2022-01-22
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多