这个问题已经有人问过了,但我找不到答案。我搜索了一段时间,发现了这些相关的问题,但它们并没有帮助我理解或回答我的问题。
带内部联接的sql插入
带左连接的t-sql插入
我的问题是如何使用连接在两个表中插入数据。例如(使用php),用户可以输入他/她的名字和他/她喜欢的食物。
我将它们存储在一个变量和一个数组中(数组的长度并不总是3,如下所示):
$name = "Niels"
$foodsHeLikes = array("apple", "pear", "banana");
这就是我想要存储它们的方式:
USERS:
UserID name
1 Niels
FOODS:
FoodID userID name //userID is linked to UserID in users table
1 1 apple
2 1 pear
3 1 banana
我在上面粘贴的第一个问题的链接有一个带有连接的insert,但是我没有看到任何地方可以像普通insert一样放入值?
这个问题的疑问是:
INSERT INTO orders (userid, timestamp)
SELECT o.userid, o.timestamp FROM users u INNER JOIN orders o ON o.userid = u.id
1条答案
按热度按时间nwwlzxa71#
从评论部分的情况来看,您的问题是希望有一个更优化的查询过程。现在您正在使用两个不同的查询来填充两个表,您想知道是否可以以更优化的方式来完成。
首先,不可能用一个查询填充两个不同的表。
但是,您可以做的是使用事务。
这个答案的其余部分将遵循这样的假设:您使用php作为后端脚本语言(正如您标记自己一样)。
另外,您是否在查询中使用准备好的语句本身并不明显。如果你不这样做,我强烈建议你使用事先准备好的陈述。否则,您将面临sql注入(sqli攻击)。
我将继续使用mysqli在这个答案中准备的语句。
因为您想优化查询,所以我们在这里使用的一般思想是使用mysql函数
LAST_INSERT_ID();
并将其存储到变量中。现在,如果您使用的是自动递增的id,那么这主要是相关的。如果你不是,你可以忽略这个特定的逻辑,使用其他的东西。但如果你是,那就继续读下去。
我们之所以将最后一个id存储到变量中,是因为我们需要多次使用它(新用户可能有多个最喜欢的食物)。如果不将最后一个id存储到变量中,它将采用初始insert后第二个表的自动递增值,这意味着在执行第三个insert语句并转发时,您将使用错误的id。
现在,正如我承诺要解释的,我使用
$conn->autocommit(FALSE);
以及$conn->commit();
是因为您可能不希望数据库中存在不完整的数据集。假设一个用户输入正在发生,但数据库却在其中崩溃。您将拥有不完整的数据集。如果这不是你真正关心的问题,那么你可以忽略它。为了简化mysql方面的工作,可以这样想: