分类 mysql 下的文章

背景: 执行mysql语句报错, Truncated incorrect DOUBLE value.
这是个非常奇怪的报错.因为实际错误和提示的并没啥关系,所以你很容易懵了,被提示误导.

这个错误经常是发生在UPDATE语句中

  • 原因1: 你将一个不能用数字表示的字符串与数字比较在where语句中. 原因是和数字比价时,mysql会字符串先转换为数字,转的时候出错就会报这个错. 如下

    UPDATE students 
    SET score = 5
    WHERE student_id = 87463298107;//student_id为字符串类型,存的值有数字或者英文字母, 所以当比到包含英文字母的行时就会出错
    • 解决方法: 字段什么类型就和什么类型值比较.改后如下

      UPDATE students 
      SET score = 5
      WHERE student_id = '87463298107';

      有趣的是,同样的where从句放在select语句中,能执行并不会报错.

  • 还有种错误是语法错误

    UPDATE students 
    SET name = 'Sarah' 
      AND score = 9
    WHERE id = '1';

    会报错ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'Sarah'. 你可能会被误导是Sarah值是不是有什么问题.然而其实和他并没关系.
    实际错误是语法错误, update多个值不是用and连接而是要将and替换成,.如下

    UPDATE students 
    SET name = 'Sarah',
      score = 9
    WHERE id = '1';

ref: https://sebhastian.com/mysql-truncated-incorrect-double-value/

我们都知道mysql要实现复制,使用insert into table_name select * from table_name语句即可.有时候只要更改其中一个字段, 但却要写出所有的字段, 这就很麻烦.今天就分享下省力的方式.

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";
UPDATE temporary_table SET Event_ID="120";
ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT;//更改主键为普通int类型
UPDATE temporary_table SET ID=NULL;
INSERT INTO original_table SELECT * FROM temporary_table;

参考链接: https://stackoverflow.com/a/15344327/8714749

答案为不能 原因很简单,如果你知道START TRANSACTION(或者他的同义语句)会触发一个隐式提交(commit), 应该就容易理解为什么没办法事务嵌套了.因为当你用START TRANSACTION开启一个子事务时,这就会触发一个隐式commit,把上一个事务给提交了.
同理,在使用事务时,也要注意,还有其他很多语句会导致事务隐式commit.具体详细见官网文档: https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html