V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiaqidianbo
V2EX  ›  问与答

mysql 创建表的时候想用到保留关键字的做法

  •  
  •   jiaqidianbo · 2015-04-29 23:57:04 +08:00 · 3767 次点击
    这是一个创建于 3498 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天在用mysql创建一个新表的时候一直报错:
    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 'INOUT varchar(20))' at line 2

    一开始以为是语句代码的问题,检查不出问题才想到可能用到数据库的保留关键字INOUT了,查了一下才知道.

    我想问一下,如果非要用这个INOUT 应该怎么办呢?

    8 条回复    2015-04-30 15:42:26 +08:00
    sivacohan
        1
    sivacohan  
       2015-04-30 00:20:38 +08:00 via Android
    推荐你看,MySQL必知必会。
    这个问题可以通过加引号解决
    raincious
        2
    raincious  
       2015-04-30 00:28:31 +08:00
    PostgreSQL里可以用双引号(")包裹字段名来使用与关键字冲突的字段名,相信MySQL也应类似,只是似乎应该使用`符号(可不是引号啊:D)。
    iyaozhen
        3
    iyaozhen  
       2015-04-30 00:34:25 +08:00
    字段前后加`(反撇键,不是引号)
    yangqi
        4
    yangqi  
       2015-04-30 00:38:36 +08:00
    @raincious
    @iyaozhen 这个和'`无关,INOUT是mysql保留字段,不能用作字段名称,目测无解,只能改名字加前缀或者后缀
    raincious
        5
    raincious  
       2015-04-30 09:13:51 +08:00
    @yangqi

    你使用的版本?C9.io上的机器是5.5.40的,我做了如下测试:

    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)

    mysql> use test;
    Database changed

    mysql> create table `INOUT` (`KEY` INT, `IN` INT, `OUT` INT);
    Query OK, 0 rows affected (0.03 sec)

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | INOUT |
    +----------------+
    1 row in set (0.00 sec)

    mysql> show columns in `INOUT`;
    +-------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | KEY | int(11) | YES | | NULL | |
    | IN | int(11) | YES | | NULL | |
    | OUT | int(11) | YES | | NULL | |
    +-------+---------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    yangqi
        6
    yangqi  
       2015-04-30 09:50:25 +08:00
    @raincious 字段名,不是表名。楼主的INOUT varchar(20)是字段名
    raincious
        7
    raincious  
       2015-04-30 09:58:33 +08:00
    @yangqi

    你……发帖前自己做过测试么?

    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)

    mysql> use test;
    Database changed

    mysql> create table `INOUT` (`INOUT` INT);
    Query OK, 0 rows affected (0.02 sec)

    mysql> show columns in `INOUT`;
    +-------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | INOUT | int(11) | YES | | NULL | |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    iyaozhen
        8
    iyaozhen  
       2015-04-30 15:42:26 +08:00
    @yangqi 字段名可以用保留字,我上次用的是date,查询时`date`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:50 · PVG 05:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.