mysql5.7 ON DUPLICATE KEY UPDATE语法将更新额外的列

mysql5.7 'ON DUPLICATE KEY UPDATE' syntax will update extra column even if you haven't updated

use 'insert ... ON DUPLICATE KEY UPDATE ...' to update some_data = VALUES(some_data), it also update created_at column

result, err := DB.Exec("INSERT INTO `test_duplicate_key_bug_table`(some_data,created_at) VALUES(?,?)", "test data", createdAt)
    require.NoError(t, err)
    id, err := result.LastInsertId()
    require.NoError(t, err)
    // mysql's timestamp only storage second's level date, re-find it's real datetime
    row := DB.QueryRow("SELECT created_at FROM `test_duplicate_key_bug_table` WHERE id=? LIMIT 1", id)
    var oldCreatedAt time.Time
    err = row.Scan(&oldCreatedAt)
    require.NoError(t, err)

    result, err = DB.Exec("INSERT INTO `test_duplicate_key_bug_table`(id,some_data,created_at) VALUES(?,?,?) ON DUPLICATE KEY UPDATE some_data = VALUES(some_data)", id, "test data again", time.Now())
    require.NoError(t, err)

    row = DB.QueryRow("SELECT some_data,created_at FROM `test_duplicate_key_bug_table` WHERE id=? LIMIT 1", id)
    var newCreatedAt time.Time
    var newData string
    err = row.Scan(&newData, &newCreatedAt)
    require.NoError(t, err)

    fmt.Printf("old time %s 
", oldCreatedAt)
    fmt.Printf("new time %s 
", newCreatedAt)
    fmt.Printf("new data %s 
", newData)

output:

old time 2019-04-12 03:29:17 +0000 UTC 
new time 2019-04-12 03:29:27 +0000 UTC 
new data test data again 

but only update id = VALUES(id), it work well

result, err := DB.Exec("INSERT INTO `test_duplicate_key_bug_table`(some_data,created_at) VALUES(?,?)", "test data", createdAt)
    require.NoError(t, err)
    id, err := result.LastInsertId()
    require.NoError(t, err)
    // mysql's timestamp only storage second's level date, re-find it's real datetime
    row := DB.QueryRow("SELECT created_at FROM `test_duplicate_key_bug_table` WHERE id=? LIMIT 1", id)
    var oldCreatedAt time.Time
    err = row.Scan(&oldCreatedAt)
    require.NoError(t, err)

    result, err = DB.Exec("INSERT INTO `test_duplicate_key_bug_table`(id,some_data,created_at) VALUES(?,?,?) ON DUPLICATE KEY UPDATE id = VALUES(id) ", id, "test data again", time.Now())
    require.NoError(t, err)

    row = DB.QueryRow("SELECT some_data,created_at FROM `test_duplicate_key_bug_table` WHERE id=? LIMIT 1", id)
    var newCreatedAt time.Time
    var newData string
    err = row.Scan(&newData, &newCreatedAt)
    require.NoError(t, err)

    fmt.Printf("old time %s 
", oldCreatedAt)
    fmt.Printf("new time %s 
", newCreatedAt)
    fmt.Printf("new data %s 
", newData)

output:

old time 2019-04-12 03:29:17 +0000 UTC 
new time 2019-04-12 03:29:17 +0000 UTC 
new data test data 

I am using docker's mysql

full example code

I guess it's the "github.com/go-sql-driver/mysql" driver problem