如何使用子查询从视图中将数据插入表中?

时间:2012-04-30 15:04:22

标签: mysql subquery

将数据插入我的表“events”

时遇到小问题
 +-------+----------+------+-----+---------+----------------+
 | Field | Type     | Null | Key | Default | Extra          |
 +-------+----------+------+-----+---------+----------------+
 | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
 | name  | longtext | YES  |     | NULL    |                |
 +-------+----------+------+-----+---------+----------------+

从我看来old_data:

+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| event | text | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+

我想将来自视图old_data的字段“event”中的数据插入表“events”中的“name”字段来执行此操作我尝试使用命令:

 insert into 'events' ('name') select 'event' from 'old_data'
 insert into 'events' ('name') select 'event' from 'old_data' group by 'event';

等等每次都是语法错误。为什么?!

1 个答案:

答案 0 :(得分:3)

您在标识符周围使用撇号分隔符是不正确的(它们用于分隔字符串)。尝试:

INSERT INTO events (name) SELECT event FROM old_data;

如果要在标识符周围使用分隔符,则应使用反引号(`):

INSERT INTO `events` (`name`) SELECT `event` FROM `old_data`;

来自MySQL manual

  

标识符引号字符是反引号(“`”):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;
     

如果启用了 ANSI_QUOTES SQL模式,也允许在双引号内引用标识符:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
     

ANSI_QUOTES 模式会导致服务器将双引号字符串解释为标识符。因此,启用此模式时,字符串文字必须包含在单引号内。它们不能用双引号括起来。服务器SQL模式按照Section 5.1.6, “Server SQL Modes”

中的描述进行控制      

如果引用标识符,标识符引号字符可以包含在标识符中。如果要包含在标识符中的字符与用于引用标识符本身的字符相同,则需要将该字符加倍。以下语句创建一个名为 a`b 的表,其中包含名为 c"d 的列:

mysql> CREATE TABLE `a``b` (`c"d` INT);
     

在查询的选择列表中,可以使用标识符或字符串引号来指定带引号的列别名:

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
     

在语句的其他地方,引用别名的引用必须使用标识符引用,或者引用被视为字符串文字。