猿问

golang代码中mysql查询的自动增量不起作用

我正在开发一个使用以太坊区块链的项目,我想用块数据填充数据库,但对于 block_id 自动增量不起作用。


下面的代码是创建查询


stmt, err := db.Prepare("CREATE TABLE IF NOT EXISTS block( block_id bigint NOT NULL AUTO_INCREMENT, block_num varchar(200), block_hash varchar(200), tx_count int, PRIMARY KEY (block_id) );")

下面的代码用于插入数据


func InsertBlock(db *sql.DB, block_num string, block_hash string, tx_count int) {

    stmt, err := db.Prepare("INSERT INTO block VALUES(?, ?, ?)")

    if err != nil {

        fmt.Println(err.Error())

    } else {

        fmt.Println("Preparation successfull for block insert: ")

    }


    _, err = stmt.Exec(block_num, block_hash, tx_count)

    if err != nil {

        fmt.Println(err.Error())

    } else {

        fmt.Println("Entry is block table is successfull: ")

    }

}

怎样才能让它自动递增呢?


这是我收到的错误:


Error 1136: Column count doesn't match value count at row 1

panic: runtime error: invalid memory address or nil pointer dereference

[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x4e1930]


海绵宝宝撒
浏览 191回答 1
1回答

慕田峪4524236

如文档中所述:如果没有为 INSERT ... VALUES 或 INSERT ... SELECT 指定列名列表,则表中每列的值必须由 VALUES 列表或 SELECT 语句提供。如果您不知道表中列的顺序,请使用 DESCRIBE tbl_name 来查找。这意味着您的查询INSERT INTO block VALUES(?, ?, ?)将始终失败,因为您只指定了四个值中的三个。因此,您需要指定列的列表,如下所示:INSERT INTO block (block_num, block_hash, tx_count) VALUES(?, ?, ?)那时 MySql 将不再抱怨,因为它知道缺失的列block_id是自动递增的,因此它不需要一个值。
随时随地看视频慕课网APP

相关分类

Go
我要回答