使用代理键时插入到表

时间:2018-10-28 03:31:38

标签: mysql database insert mariadb

我有两个表:

表1为:

  • 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,而只是{{ 1}}。

关于如何有效地进行这项工作的任何想法?

还是我应该放弃代理密钥并继续使用自然密钥?

谢谢

1 个答案:

答案 0 :(得分: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)。如果可能,最好直接使用主键。