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

auto increment in mysql query in golang code not working

我正在开发一个使用以太坊区块链的项目,我想用块数据填充数据库,但是 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]

documentation中指定:

If you do not specify a list of column names for INSERT ... VALUES or INSERT ... SELECT, values for every column in the table must be provided by the VALUES list or the SELECT statement. If you do not know the order of the columns in the table, use DESCRIBE tbl_name to find out.

这意味着您的查询 INSERT INTO block VALUES(?, ?, ?) 将始终失败,因为您只指定了四个值中的三个。

因此您需要指定列的列表,如下所示:

INSERT INTO block (block_num, block_hash, tx_count) VALUES(?, ?, ?)

到那时 MySql 将不再抱怨,因为它知道缺少的列 block_id 是自动递增的,因此它不需要相应的值。