这个PHP-MySQL CREATE TABLE查询有什么问题?

时间:2010-01-08 15:28:59

标签: php mysql

首先,我刚开始用PHP学习MySQL。

我的查询直接从我的IDE中复制/粘贴:

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
                id       int(11)        unsigned  NOT NULL  auto_increment,
                show     tinyint(1)     unsigned  NOT NULL  default '0',
                to       varchar(255)             NOT NULL  default '',
                from     varchar(255)             NOT NULL  default '',
                type     varchar(255)             NOT NULL  default '',
                message  varchar(255)             NOT NULL  default '',
                PRIMARY KEY(id)
             ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";

$result = mysql_query( $query, $link ) OR exit ( mysql_error() );

导致此错误:

  

您的SQL语法有错误;   靠近'显示 tinyint(1)unsigned NOT   NULL默认为'0',为varchar(255)N'   在第4行

...所以我向show添加了一个字符(例如showz)并收到此错误:

  

您的SQL语法有错误;   靠近' varchar(255)NOT NULL   默认'',来自varchar(255)NOT   NUL'在第5行

...所以我向to添加了一个字符(例如toz)并收到此错误:

  

您的SQL语法有错误;   靠近'来自 varchar(255)NOT NULL   默认'',输入varchar(255)NOT NU'   在第6行

...所以我在from添加一个字符(例如fromz)并且工作正常!?

发生了什么事?洛尔

如果这个问题过于明显,如果社区认为这样做是谨慎的话,我会删除它,但与此同时我很难过。

顺便说一句,我对间距,表壳和其他东西搞砸了没有任何成功。

4 个答案:

答案 0 :(得分:4)

SHOWTOFROM是保留的MySQL关键字。你必须用反引号引用它们,使它们作为列名工作:

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
    `id` int(11) unsigned NOT NULL auto_increment,
    `show` tinyint(1) unsigned NOT NULL default '0' ,
    `to` varchar(255) NOT NULL default '' ,
    `from` varchar(255) NOT NULL default '' ,
    `type` varchar(255) NOT NULL default '' ,
    `message` varchar(255) NOT NULL default '' ,
    PRIMARY KEY(id)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";

这通常是一种很好的做法(尽管不需要)以这种方式引用每个列名称,以防止与关键字的意外冲突,因为有数百个。有关完整列表,请参阅http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

答案 1 :(得分:2)

您可能对this list of reserved words in MySQL statements感兴趣。简而言之,如果您想将这些中的任何一个用作列名(或以下查询中的任何位置),您必须引用它们,通常在反引号中:

`show` TINYINT(1) UNSIGNED NOT NULL,

......以后:

SELECT `show` FROM `varchar` WHERE `to`="France"

答案 2 :(得分:0)

只是在黑暗中刺伤,但是来自mysql中的保留词?你可以将这些单词包含在[]中,如[to]和[from],或者像你一样将条款更改为toperson或fromperson?

答案 3 :(得分:0)

这不是您的问题的答案,但它是“一个 PHP-MySQL CREATE TABLE查询有什么问题?”的答案。 (对于另一位Google员工)

也许不是所有版本的PHP都是这样的,但是在我的环境中,当我尝试创建一个表时,像“mysql_query”这样的非PDO命令会引发错误:

CREATE TABLE IF NOT EXISTS `actionlog`

错误:

You have an error in your SQL syntax

与PDO适配器配合使用。