mysql中的反引号与保留关键字desc问题

探讨MySQL中保留字desc作为字段名时的问题及解决办法。通过使用反引号括起来的方式避免语法错误,并给出建表建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

键盘上1左边,Esc下边那个键就是反引号键
mysql中,desc是保留字,建表时不能用于字段名,表名:
mysql>  create table desc (id varchar(255));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc (id varchar(255))' at line 1
mysql>  create table test3(desc varchar(255));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc varchar(255))' at line 1
但将desc放到反引号中则正常
mysql>  create table `desc` (id varchar(255));
Query OK, 0 rows affected (0.01 sec)
mysql>  create table test3 (`desc` varchar(255));
Query OK, 0 rows affected (0.00 sec)
mysql> drop table desc;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc' at line 1
mysql> drop table `desc`;
Query OK, 0 rows affected (0.00 sec)
有些管理员在建表时,为了省事,可能会选择从一个现有的表cp建表语句,修改创建.字段命名如果不规范的话,可能会用到mysql中的保留字,如上述的desc
例如从show create table xxx 或者mysqldump --no-data中取出建表语句,形式如下:
CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `time` datetime NOT NULL default '0000-00-00 00:00:00',
  `type` int(10) unsigned NOT NULL default '0',
  `desc` varchar(255) default NULL,
  primary key `i_id` (`id`)
) ENGINE=innodb DEFAULT CHARSET=latin1;
创建成功后,在insert时如果不带反引号就会遇到问题
mysql> insert into test(`time`,`type`,`desc`) values(now(),5,'aa');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test(time,type,desc) values(now(),5,'aa');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc) values(now(),5,'aa')' at line 1
mysql>
针对这个问题,有2个建议
1) 在建表时,不要用保留字作表名,字段名.可以加一个前缀标志加以区分,如在表名前加t_, 在列名前加F
2) 建表时,不要给表名/字段名/索引名加反引号,以免隐藏问题
反引号中带保留字建表时,mysql为什么不报错呢?
得先搞清楚反引号的本意,及show create table,mysqldump出来的数据带反引号的目的是什么.
有哪位知道,望不吝踢教~.~

相关资料:

mysql中的反引号与保留关键字desc问题来源网络,如有侵权请告知,即处理!

 

本文来源于:http://biancheng.dnbcw.info/mysql/267499.html

<think>我们正在回答用户的问题MySQL中包含哪些关键字,请对这些关键字进行详细介绍 根据引用[1]和引用[4],我们知道MySQL关键字是数据库中具有特殊含义的保留字,用于定义数据库结构、操作数据和控制行为。我们将按照功能分类介绍关键字。 注意:由于MySQL关键字非常多,不可能全部列举,我们将按照常用功能分类,并挑选每个类别中的关键关键字进行详细介绍。 分类参考引用[1]和引用[4]: 1. 数据定义语言(DDL)关键字 2. 数据操作语言(DML)关键字 3. 数据查询语言(DQL)关键字 4. 数据控制语言(DCL)关键字 5. 事务控制关键字 6. 其他常用关键字 我们将按照这个结构进行回答,每个关键字包括: - 关键字名称 - 作用 - 基本语法示例 - 注意事项(如果有) 注意:引用[2]和引用[3]的内容关键字列表关系不大,但引用[3]提到了GROUP BY的使用注意事项,我们在介绍GROUP BY时会提到。 开始回答:</think>### MySQL 关键字详解 MySQL 关键字是 SQL 语句中具有特殊功能的保留词,用于定义数据库操作、控制数据行为及管理对象。以下是按功能分类的核心关键字详解: --- #### 一、**数据定义语言(DDL)关键字** 用于创建、修改或删除数据库对象: 1. **`CREATE`** - 作用:创建数据库、表、索引等对象 - 示例: ```sql CREATE TABLE users (id INT, name VARCHAR(50)); -- 创建表 CREATE INDEX idx_name ON users(name); -- 创建索引 ``` 2. **`ALTER`** - 作用:修改现有对象结构 - 示例: ```sql ALTER TABLE users ADD COLUMN email VARCHAR(100); -- 新增列 ``` 3. **`DROP`** - 作用:删除数据库对象 - 示例: ```sql DROP TABLE users; -- 删除表 ``` 4. **`TRUNCATE`** - 作用:快速清空表数据(保留结构) - 示例: ```sql TRUNCATE TABLE logs; -- 清空日志表 ``` --- #### 二、**数据操作语言(DML)关键字** 用于增删改数据记录: 1. **`INSERT`** - 作用:插入新记录 - 示例: ```sql INSERT INTO users (id, name) VALUES (1, 'Alice'); ``` 2. **`UPDATE`** - 作用:修改现有记录 - 示例: ```sql UPDATE users SET name = 'Bob' WHERE id = 1; ``` 3. **`DELETE`** - 作用:删除记录 - 示例: ```sql DELETE FROM users WHERE id = 1; ``` --- #### 三、**数据查询语言(DQL)关键字** 用于检索数据: 1. **`SELECT`** - 作用:查询数据 - 示例: ```sql SELECT name, email FROM users; ``` 2. **`FROM`** - 作用:指定查询的数据源表 3. **`WHERE`** - 作用:过滤查询结果 - 示例: ```sql SELECT * FROM users WHERE age > 18; ``` 4. **`DISTINCT`** - 作用:返回唯一值(去重) - 示例: ```sql SELECT DISTINCT city FROM customers; ``` 5. **`ORDER BY`** - 作用:排序结果集 - 示例: ```sql SELECT * FROM products ORDER BY price DESC; ``` 6. **`LIMIT`** - 作用:限制返回记录数 - 示例: ```sql SELECT * FROM orders LIMIT 10; -- 返回前10条 ``` --- #### 四、**连接分组关键字** 1. **`JOIN`** 系列 - **`INNER JOIN`**:内连接(默认,可省略 `INNER`)[^2] ```sql SELECT * FROM orders INNER JOIN customers ON orders.cust_id = customers.id; ``` - **`LEFT JOIN`**:左连接(返回左表全部+右表匹配) - **`RIGHT JOIN`**:右连接 2. **`ON`** - 作用:指定连接条件 3. **`GROUP BY`** - 作用:按列分组(常聚合函数联用) - 注意:`SELECT` 非聚合列需在 `GROUP BY` 中声明,否则返回随机值[^3] ```sql SELECT country, COUNT(*) FROM users GROUP BY country; ``` 4. **`HAVING`** - 作用:过滤分组后的结果(类似 `WHERE`,但用于聚合值) ```sql SELECT country, COUNT(*) AS cnt FROM users GROUP BY country HAVING cnt > 100; ``` --- #### 五、**事务控制关键字** 1. **`START TRANSACTION`** - 作用:开启事务 2. **`COMMIT`** - 作用:提交事务(永久保存更改) 3. **`ROLLBACK`** - 作用:回滚事务(撤销未提交的操作) --- #### 六、**权限管理关键字** 1. **`GRANT`** - 作用:授予用户权限 - 示例: ```sql GRANT SELECT, INSERT ON db.* TO 'user'@'localhost'; ``` 2. **`REVOKE`** - 作用:撤销用户权限 - 示例: ```sql REVOKE DELETE ON db.* FROM 'user'@'localhost'; ``` --- #### 七、**其他关键关键字** | 关键字 | 作用 | 示例 | |--------------|-------------------------------|-------------------------------------------| | `USE` | 选择数据库 | `USE my_database;` | | `EXPLAIN` | 分析查询执行计划 | `EXPLAIN SELECT * FROM users;` | | `UNION` | 合并查询结果(自动去重) | `SELECT col1 FROM t1 UNION SELECT col2 FROM t2;` | | `CHECK` | 创建检查约束 | `ALTER TABLE orders ADD CHECK (amount>0);` | | `FOREIGN KEY`| 定义外键约束 | `FOREIGN KEY (user_id) REFERENCES users(id)` | --- ### 注意事项 1. **关键字冲突** 若列名关键字同名,需用引号转义: ```sql SELECT `from`, `to` FROM messages; -- 列名"from"是关键字 ``` 2. **大小写不敏感** MySQL 关键字不区分大小写(`SELECT` 等效 `select`)。 3. **性能影响** - `DISTINCT` 和 `GROUP BY` 可能导致全表扫描,大表需加索引优化[^4] - `LIMIT` 配合 `ORDER BY` 可提升分页效率 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混进IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值