首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL严格模式

MYSQL严格模式
EN

Stack Overflow用户
提问于 2022-01-02 15:38:25
回答 1查看 794关注 0票数 0

对于

STRICT_ALL_TABLES,MySQL返回一个错误并忽略其余的行。但是,由于前面的行已经插入或更新,所以结果是部分更新。若要避免这种情况,请使用单行语句,这些语句可以在不更改表的情况下中止。对于STRICT_TRANS_TABLES,MySQL将无效值转换为列的最近有效值,并插入调整后的值。如果缺少值,MySQL将插入列数据类型的隐式默认值。在任何一种情况下,MySQL都会生成警告而不是错误,并继续处理该语句。隐式默认值在第11.6节“数据类型默认值”中进行了描述。

我尝试设置STRICT_TRANS_TABLE,并尝试在没有事务的情况下插入无效记录。尽管有文献记载,它还是显示了一个错误。

代码语言:javascript
复制
 mysql> show create table mydemo;
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                    |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| mydemo | CREATE TABLE `mydemo` (
  `pk` int(20) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM mydemo;
+----+------+
| pk | name |
+----+------+
|  1 | Test |
+----+------+
1 row in set (0.00 sec)

mysql> SELECT @@SESSION.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@SESSION.sql_mode                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into mydemo values (2, "abcdefghijklmn");
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> select @@SESSION.autocommit;
+----------------------+
| @@SESSION.autocommit |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

  1. 指的是非事务表是什么意思?在上面的
  2. 中,为什么它显示错误而不是警告?如果两种模式都设置好了,
  3. 怎么办?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-02 16:44:04

您的表类型是you,它是一个事务性表类型(支持事务),因此在引用的两个表之前的te段适用:

对于事务性表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES时,数据更改语句中的无效值或缺失值将发生错误。语句被中止并回滚。

您引用的两段适用于非事务性表,如myisam。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70557316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档