Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何基于另一个插入到表中?_Mysql_Sql_Join_Insert - Fatal编程技术网

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;