Mysql 如何基于另一个插入到表中?
我有两张桌子:Mysql 如何基于另一个插入到表中?,mysql,sql,join,insert,Mysql,Sql,Join,Insert,我有两张桌子: // users +----+-------+-----------------------+--------+ | id | name | email | active | +----+-------+-----------------------+--------+ | 1 | peter | peter12@hotmail.com | NULL | | 2 | jack | most_wanted@gmail.com | N
// users
+----+-------+-----------------------+--------+
| id | name | email | active |
+----+-------+-----------------------+--------+
| 1 | peter | peter12@hotmail.com | NULL |
| 2 | jack | most_wanted@gmail.com | NULL |
| 3 | john | john_20016@yahoo.com | NULL |
+----+-------+-----------------------+--------+
// activate
+----+---------+---------------------+
| id | post_id | random_string |
+----+---------+---------------------+
| 1 | 2 | fewklw23523kf |
+----+---------+---------------------+
我还有两个变量:
$random string = 'gergflkw4534l';
$email = 'peter12@hotmail.com';
我想根据这两个变量在activate
表中插入一个新行。以下是预期结果:
// activate
+----+---------+---------------------+
| id | post_id | random_string |
+----+---------+---------------------+
| 1 | 2 | fewklw23523kf |
| 2 | 1 | gergflkw4534l |
+----+---------+---------------------+
如您所见,我根据电子邮件列从用户表中获取post\u id
。我该怎么做
你的语法非常错误。您需要一个WHERE
子句,然后才能将任何内容加入其中。我假设Activate表中的id
列是一个自动编号列
INSERT INTO Activate (post_id, random_string)
SELECT
id,
:random_string
FROM
Users
WHERE
email = :email
您可能希望使用mysql语法:
在WHERE
子句之后写LIMIT 1
会更好吗?我不知道这能实现什么。您是否希望电子邮件地址与多行匹配?如果是,那么您是否应该只插入一行?如果是,您如何确定该插入使用哪个ID?否,电子邮件
是唯一的,并且始终与一行匹配。我这么说是因为我认为如果我最后写limit1
,速度会更快。我说得对吗?这不应该让它更快。如果您将在表上执行这些类型的查询,那么您可能应该在电子邮件地址列上有一个索引。如果电子邮件地址是唯一的,那么在电子邮件列上也应该有一个唯一的键。如果您有一个非常大的表,电子邮件列上没有索引,列上没有唯一键,那么可能会出现LIMIT 1
运行更快的情况。如果是那样的话,你会有更重要的设计问题需要担心。我明白了。我的最后一个问题是,我是否应该在电子邮件栏中同时设置唯一索引
和普通索引
?或者只需唯一索引
就足够了?
INSERT INTO Activate (post_id, random_string)
SELECT
id,
:random_string
FROM
Users
WHERE
email = :email
INSERT INTO activate (post_id, random_string)
SELECT id, :random_string
FROM users
WHERE email = :email
LIMIT 1;