【问题标题】:Database column Varchar Int dilemma数据库列 Varchar Int 困境
【发布时间】:2014-02-03 22:44:45
【问题描述】:

我对食谱很感兴趣,

recipe->recipecomponent

如果我插入一个带有配料的食谱,我会在食谱和成分表上都插入,然后将两者的 id 插入到中间表中。

所以中间表有 2 个 col,它们是表的外键和 PK 到其他 2 个 Auto Increment int 类型的表。

现在的问题是,如果我插入包含 2 种成分的配方,因为我会在组件上插入 2 行,这意味着我需要将 2 个 id 从组件插入到配方组件中。

例如。

说,我刚刚插入了一个包含 2 种成分的食谱,

当我在配方中插入时,id 是 1(AI,INT)。 因为它有 2 种成分,我将 2 插入到组件中。 那么应该有 1(AI,INT) 和 2(AI,INT)。

然后我必须将这些 ids(它们是 2 个表的 PK)作为 FK 插入到中间表中。

预期的行将在 recipecomponent 表上

recipeid - 组件id

1   ||    1 2

如何插入组件 ID。我用数组插入它吗?

$insert_row = array('recipeid'=>$recipeid,'componentid'=>componentids);

假设 componentids 是一个数组,包含来自组件表的 1,2 个 id。

这没问题,但是当您尝试插入时。它将在值中显示为 ARRAY,这会发出错误

严重性:通知

消息:数组到字符串的转换

文件名:mysqli/mysqli_driver.php

行号:553

错误号:1054

“字段列表”中的未知列“数组”

插入recipecomponentrecipeidcomponentid)值(1, 数组)

文件名:C:\www\KG\system\database\DB_driver.php

行号:330

虽然我找到了解决方案,但我使用 implode 将其转换为字符串

$new_component_id = implode(' ',$componentid);

但是由于它现在是一个字符串“1 2”,当我将它插入到 int 类型的列中时,它只在行中显示第一个数字,即 1。

我考虑过单独插入。这对于只有 2 种成分的食谱来说没有问题。

会是这样的:

recipeid - 组件id

1 || 1

1 || 2

但假设我插入了一个包含至少 4 种成分的食谱,还有更多要插入的成分。会不会浪费内存?

如果是这样,我在想是否有任何字符被视为整数但被接受为要插入的值,例如假设字符 -

所以当我插入字符串 1-2 时,它会在我的 col 上显示为 1-2,这是一个 int 类型。

我需要一些专业的帮助和建议。

【问题讨论】:

  • 附加信息,我要求一个字符的最后一部分是因为我怀疑它被空格字符切断,所以没有包括 2。但是如果我切断空间,我将无法确定插入的 id。它现在看起来像 12,而不是 1 2 id。这是一个问题。

标签: database string insert int


【解决方案1】:

最后一个选项,每个成分有一个记录,是正确的方法。这就是桥接表“recipecomponent”的用途。

在同一列中插入多个值(如在您的第一个示例中)是针对 normalisation 的(同样,这就是桥接表的用途)。更重要的是,当您查询特定 id 时,将 id 放在不同记录上比解析具有多个 id 的字符串要快。

$new_component_id 发生的情况(即第二个 id 被截断)可能是由于某些数据类型转换(无论是在数据库端还是在 PHP 端发生这种情况,在您报告的问题中并不明确)。

如果您希望仅使用一个查询插入多个成分,您可以使用以下语法:

INSERT INTO recipecomponent (recipeid, componentid) VALUES (1,1), (1,2), (1,3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多