“'字段列表'中的未知列”,但列确实存在

时间:2013-04-13 15:37:10

标签: mysql sql insert innodb

DROP TABLE IF EXISTS `transactions`;
CREATE TABLE `transactions` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `purchase_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `transactions` (`purchase_date`) VALUES (NULL)

我在此代码中已经解决了我的问题。当我运行它时,我收到错误:

  

[查询3中的错误]'字段列表'中的未知列'purchase_date'

有人有想法吗?

9 个答案:

答案 0 :(得分:20)

purchase_date语句中的'INSERT之间插入了一个不可打印的字符30(RecordSeparator)。只需删除文本('purchase_date')并手动重写即可。

答案 1 :(得分:5)

当我收到此错误时,Nery利基解决方案。

我的桌面上有一个BEFORE INSERT触发器,它与 NEW.`field_mysql_doesnt_think_exists` 做了一些事情,如果我没有将该字段传递给插入语句,那么我会得到

[ERROR in query 3] Unknown column 'field_mysql_doesnt_think_exists' in 'field list'

答案 2 :(得分:3)

我只花了一天的时间来解决这个问题。我的问题是一样的:看不见的字符和查询并返回“未知列”错误。

我通过使用NotePad ++重新登录Windows并删除垃圾来解决它。

垃圾是如何首先进入那里的?我认为这是因为我错误地将一些长复杂的查询复制到LibreOffice Writer(我的功能规范文档)中,而不是仅仅在phpMyAdmin中将它们加入书签或将它们保存在文本编辑器中。将它们从LibreOffice粘贴到查询窗口中是(我认为)垃圾来源的地方。

在那里,它像疟疾一样持续存在。我甚至无法通过手工重新输入整个查询来解决它 - 我必须将它放入NotePad ++(编码菜单)并显示ANSI和UTF8组合,然后手动删除垃圾。

一旦完成,查询就有效了。

答案 3 :(得分:2)

如果在构建表结构时粘贴列名,也会发生这种情况。相同的错误 - 但是不可打印/不可见的字符在表结构中,而不是查询。

答案 4 :(得分:1)

今天早上我遇到了同样的问题,但没有找到答案。 但是,当我将查询周围的单引号更改为双引号时,发现了问题。这么小的东西和疏忽会引起真正的头痛。

“字段列表”中的x未知列-下面的代码用单引号引起来-无效。

    $likepost='INSERT INTO reaction(reaction_num,userreaction_id,timereacted,
    streamitem_id,comment_posted_on) 
    VALUES ($reaction,$target,NOW(),$streamid,$comment_id)';

下面的代码用双引号引起来。工作

    $likepost="INSERT INTO reaction(reaction_num,userreaction_id,timereacted,
    streamitem_id,comment_posted_on) 
    VALUES ($reaction,$target,NOW(),$streamid,$comment_id)";

答案 5 :(得分:0)

这可能对其他人没有帮助,但添加“以防万一”它可以帮助某人。

在我的情况下,这是一个不同的解决方案。

我收到大型数据集作为Excel CSV文件,并使用(WIL)脚本将.csv文件转换为可导入的.sql文件。我的脚本中有一个错误,这两行没有引用相同的表名(我对第一个位置进行了硬编码而忘记更新):

* "INSERT INTO `old_table_name` (`cid`, `date`, etc etc"
* "CREATE TABLE IF NOT EXISTS `":_dbName:"` (etc etc "

我刚刚更改了第一行,也从变量中获取了表名,瞧!

* "INSERT INTO `":_dbName:"` (`cid`, `date`, etc etc"

请检查导入SQL文件中的这两行。

答案 6 :(得分:0)

在不同场景中出现相同错误:

当您错过变量的@符号时也会发生这种情况。

SET @myVar1=1;  SELECT @myVar1;  -- GOOD, correctly prints:  1
SET @myVar1=1;  SELECT  myVar1;  -- BAD, prints:  Unknown column 'myVar1' in 'field list' 

答案 7 :(得分:0)

查看您要处理的表的名称

答案 8 :(得分:0)

当您想使用像这样的函数使用mysql时:

function insert($table, $info_array){
    // implode keys as columns by [`,`] glue string
    $columns = implode("`,`", array_keys($info_array));

    // implode values as sql ready values by [','] glue string
    $values = implode("','", array_values($info_array));

    // make query(careful about [`] for columns name and ['] for values)
    $sql = "INSERT INTO ".$table." (`".$columns."`) VALUES ('".$values."');";
    return $sql;
}

对于表列名称的 [`] 和对于值的 [']或[“] ,您应该小心。 例如,我以这种方式使用上述功能:

try{
        $db_insert_sample_user = $connection->query(insert(TABLE_PREFIX."users", [
            "username" => "my_name_2",
            "password" => md5("how457fty")
        ]));
        echo '<pre>';
        print_r($db_insert_sample_user);
        echo '</pre>';
    }catch (PDOException $exc){
        echo '<pre>';
        print_r($exc);
        echo '</pre>';
    }

查询字符串是这样的:

INSERT INTO php_pdo_users (`username`,`password`) VALUES ('my_name_2','ee04708d313adf4ff8ba321acf3eb568');

,结果类似于:(对于两个用户) PHPMyAdmin Result

如果您想要基于预准备语句的函数,请进行以下测试:(占位符,参数和值,根本不需要[']或[“]!

function insert_prepared(PDO $connection, $table, $info_array){
    // columns
    $columns = implode("`,`", array_keys($info_array));

    // placeholders
    $place_holders = [];
    for ( $i = 0; count(array_keys($info_array)) > $i; $i++){
        $place_holders[] = '?';
    }

    // convert placeholders to query string
    $place_holders_str = implode(",", $place_holders);
    $prepared_stmt = "INSERT INTO ".$table." (`".$columns."`) VALUES (".$place_holders_str.");";

    // prepare statement
    $stmt = $connection->prepare($prepared_stmt);

    // values
    $values = array_values($info_array);

    // bind all params to values
    for($i = 0; count($values) > $i; $i++){
        $stmt->bindParam($i + 1, $values[$i]);
    }

    // execute and return results
    return $stmt->execute();
}

以这种方式执行代码后:

try {
        $db_insert_sample_user = insert_prepared(
            $connection,
            TABLE_PREFIX . "users",
            [
                "username" => "my_name_4",
                "password" => md5( "HelloDolly#__3" )
            ]
        );
    } catch ( PDOException $exc ) {
        echo "Failed : " . $exc->getMessage();
    }

结果是: Results with insert_prepared function