-
2021-11-24 19:50:55
MyCAT非空字段插入null却不报错
【问题】:MySQL字段定义为 not null default ''或not null; 在项目中执行插入,插入的字段是null,线下却没报错,线上报错。
【解决】:可能线下线上分库分表插件MyCAT配置不同,导致SQL执行有差异。在线下通过ShardingSphere+MySQL实现分库替换掉MyCAT,就正常抛出了异常。
【另外】sql_mode不同,也可能导致不同环境相同SQL执行有差异。sql_mode文档:Server SQL Modes,
MySQL 5.7 模式(SQL_MODE)详细说明更多相关内容 -
如何在 iBatis 应用程序向 Oralce 数据表字段插入 NULL 值
2019-01-20 20:47:02如何在 iBatis 应用程序向 Oralce 数据表字段插入 NULL 值用 iBatis 应用程序连接的数据库是 Oracle, 映射文件中的插入语句写成如下形式
1.
<!-- 插入一条Person对应的记录到数据库中 -->
2.
<
insert
id
=
"insertPerson"
parameterClass
=
"com.unmi.Person"
>
3.
INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(#id#,#name#,#passwd#)
4.
</
insert
>
Person表的三个字段都允许NULL值,当在用如下程序1.
SqlMapClient sqlMap = SqlMapConfig.getSqlMapInstance();
// as coded above
2.
Person person =
new
Person(
1
);
3.
person.setName(
"Unmi"
);
4.
// person.setPasswd("123456"); // 注意该行被注释,让passwd属性为NULL
5.
sqlMap.insert(
"insertPerson"
, person);
执行后程序报错
Exception in thread "main" com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in com/unmi/Person.xml.
--- The error occurred while applying a parameter map.
--- Check the insertPerson-InlineParameterMap.
--- Check the parameter mapping for the 'passwd' property.
--- Cause: java.sql.SQLException: 无效的列类型
Caused by:java.sql.SQLException: 无效的列类型
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:91)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:442)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:81)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert(SqlMapClientImpl.java:58)
at com.unmi.Client.main(Client.java:33)
Caused by:java.sql.SQLException: 无效的列类型
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:273)
at oracle.jdbc.driver.OracleStatement.get_internal_type(OracleStatement.java:4560)
at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:869)
at com.ibatis.sqlmap.engine.mapping.parameter.BasicParameterMap.setParameter(BasicParameterMap.java:171)
只要去掉 person.setPasswd("123456");前的注释,让Person的三个字段都不为NULL,才能成功向数据库中插入记录。其实Person表并没有任何约束,却是iBatis在此拦截下来,实是多此一举。那如果我确实让某个字段是NULL值,该怎么做呢?您只要修改一下映射文件中预置的SQL语句就行了,告诉iBatis当该字段出现NULL值该用什么值来替代,连接Oracle即使是要求某字段传入NULL值时就是插入NULL值也必须要你累述一遍,好讨厌的事情。1.
<!-- 插入一条Person对应的记录到数据库中 -->
2.
<
insert
id
=
"insertPerson"
parameterClass
=
"com.unmi.Person"
>
3.
INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(#id#,#name#,#passwd:VARCHAR:NULL#)
4.
</
insert
>
支持的类型在 java.sql.Types 中列示出来了,我一开始还把上面的 VARCHAR 错写成了 VARCHAR2。再比如果你想传入的 id 为NULL时替换为 0, 你就可以写成 #id:INTEGER:0#。
原因是 iBatis 是根据参数的当前值的类型(而不是类属性) 来决定对于这个 PrepairedStatement设置参数是应该调用哪一个版本的 setXxx() 方法(是 String 就调用,setString() ,是 int就调用 setInt() 等)。而如果参数值为 null,iBatis 便不知道调用哪个 setXxx() 方法,于是在 Oracle的驱动下就笼统的调用 setNull() 方法,然而 Oracle 在对字符串类型字段使用 setNull()却是有问题的。因为在配置中就必须指明当前字段的类型,如 #passwd:VARCHAR:NULL#,当 iBatis 在碰到参数为 null难以决断时,但见到这里的 VARCHAR 选项,它也知道应该用 setString() 方法来给 PrepairedStatement赋值。至于其中的 NULL,不过是指定参数为 null 时的默认值,显然,写成 #passwd:VARCHAR# 就行了,后面的 NULL是多余的。
不知你注意到没有,我们上面的insert标记配置了属性是 parameterClass,那如果配置的是 parameterMap 该如何解决因字段为NULL值的问题呢?这就要求我们在配置parameterMap标记中可能出现NULL值的参数一定要指定相应的jdbcType属性就行。只要不指定nullValue属性就表示在该表这段中直接记下NULL值。01.
<
parameterMap
id
=
"insert-person-paraMap"
class
=
"com.unmi.Person"
>
02.
<
parameter
property
=
"id"
/>
03.
<
parameter
property
=
"name"
/>
04.
<
parameter
property
=
"passwd"
jdbcType
=
"VARCHAR"
/>
05.
</
parameterMap
>
06.
<!-- 插入一条Person对应的记录到数据库中 -->
07.
<
insert
id
=
"insertPerson"
parameterMap
=
"insert-person-paraMap"
>
08.
INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(?,?,?)
09.
</
insert
>
最后我连接MySql数据库,根本不需要为插入NULL值而考虑设置JDBC类型,平常对待,看来这是iBatis处理Oracle数据库的一个Bug.参考链接:
1. ibatis problem inserting null value for Date type
2. iBatis框架插入一条数据有些字段是空值没法插入
3. iBatis学习心得
补充:
2008-05-25,连接 Oracle 8.0.5 时写成INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(#id#,#name#,#passwd:DATE:NULL#)时,插入的日期字段值为 NULL 还是会报出无法转换类型的错误,解决办法是把后面那个 NULL去掉:INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(#id#,#name#,#passwd:DATE#)再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
-
数据库表字段not null代码插入时默认为null
2018-09-27 14:11:33这样做数据库是性能好了一点,可是有些字段就是没有值,插入的时候就会报错,也没有用到默认值,后来找了原因是因为mybatis持久化,直接插入实体对象没有值的会默认给null。 处理的方法呢就是在insert方法里先进行...做系统有需要新增表,新增的表被要求所有的字段都是not null类型的,可以有默认值,真的是有点坑啊!这样做数据库是性能好了一点,可是有些字段就是没有值,插入的时候就会报错,也没有用到默认值,后来找了原因是因为mybatis持久化,直接插入实体对象没有值的会默认给null。
处理的方法呢就是在insert方法里先进行非空判断,如果不为空就插入否则就直接不显示这个字段
一开始的插入语句是这个样子的
INSERT INTO <include refid="tableName"/> ( <include refid="baseColumn"/> ) VALUES ( <include refid="baseValueColumn"/> ) <sql id="baseColumn" > id, code, name, remark, sort, creater, modifier, gmt_create, gmt_modify, del_status </sql> <!--插入列--> <sql id="baseValueColumn"> null, #{code}, #{name}, #{remark}, #{sort}, #{creater}, #{modifier}, now(), now(), #{delStatus} </sql>
这样的语句如果为空,数据库设置的不能为空就会报错
修改后的sql语句
INSERT INTO <include refid="tableName"/> <trim prefix="(" suffix=")" suffixOverrides="," > <if test="code != null" > code, </if> <if test="name != null" > name, </if> <if test="remark != null" > remark, </if> <if test="sort != null" > sort, </if> <if test="creater != null" > creater, </if> <if test="modifier != null" > modifier, </if> gmt_create, gmt_modify, <if test="delStatus != null" > del_status, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="code != null" > #{code,jdbcType=VARCHAR}, </if> <if test="name != null" > #{name,jdbcType=VARCHAR}, </if> <if test="remark != null" > #{remark,jdbcType=VARCHAR}, </if> <if test="sort != null" > #{sort,jdbcType=INTEGER}, </if> <if test="creater != null" > #{creater,jdbcType=VARCHAR}, </if> <if test="modifier != null" > #{modifier,jdbcType=VARCHAR}, </if> now(), now(), <if test="delStatus != null" > #{delStatus,jdbcType=VARCHAR}, </if> </trim>
可能还有更好的方法,但是我用的是这种
以上
最后共勉:
With the right kind of coaching and determination you can accomplish anything.
正确的训练加上坚定的决心,你将攻无不克。
-
MySQL中可为空的字段设置为NULL还是NOT NULL
2020-12-16 10:54:391、我字段类型是not null,为什么我可以插入空值 2、为什么not null的效率比null高 3、判断字段不为空的时候,到底要用 select * from table where column <> '' 还是要用 select * from table where column is... -
表字段初始值、NULL等问题
2019-06-19 17:52:1920.17. 表字段初始值、NULL等问题 20.17.1. SE11表设置中的Initial Values 如果一个表是新创建的,数据库中的所有字段都会被设计成非NULL,此时与钩不钩上“Initial Values”框没有关系,且都会设置默认值,并且...20.17. 表字段初始值、NULL等问题
20.17.1. SE11表设置中的Initial Values
如果一个表是新创建的,数据库中的所有字段都会被设计成非NULL,此时与钩不钩上“Initial Values”框没有关系,且都会设置默认值,并且所有的主键都会强制将“Initial Values”框钩上
该标示只在修改表结构且在现有表结构增加一个字段时,才起作用,并且只对新增的字段有影响
如果在给现已有的表中增加一个字段,调整表结构时,如果新加的字段没有钩上“Initial Values”,则对应到数据库表设计中表示该字段则为NULL;如果钩上了,则数据库中的相应字段不为NULL,并且会设置一个默认值
20.17.2. 底层数据库表字段默认值
字符类型的字段默认值大多数(极个别使用空字符串)为一个空格,数字字符串与日期为相应位数的0字符中,数字类型为0:
上面数据库表设计视图中的默认值所对应的创建SQL如下:
createdefault [ecc].[str_default] as ' ' 一个空格
createdefault [ecc].[empstr_default] as '' 空字符串
createdefault [ecc].[raw_default] as 0x00
createdefault [ecc].[numc5_default] as '00000'
createdefault [ecc].[numc8_default] as '00000000'
createdefault [ecc].[num_default] as 0
20.17.3. ABAP初始值、底层数据库表默认值相互转换
20.17.3.1.向表中插入初始值
在通过ABAP向数据库中插入数据时,不可能将NULL插入到表中,因为SAP系统将数据插入到数据库表之前会判断各字段值是否是ABAP程序中相应的初始值,如果为ABAP程序初始值,则使用相对应ABAP词典中的内置类型初始值进行插入;所以数据库表中字段值为NULL只有一种情况,就是调整表结构时(增加字段),没有将Initial Values钩上
DATA: wa_strc LIKE ytest2..
CLEAR: wa_strc.
INSERT ytest2 FROM wa_strc.
内存中的数据(其中类型为P类型字段的初始值为 000...00C ,最后的 C 表示整数位为12位,剩下小数位数为 16 -12 – 1 = 3 位,其中算术式中的1表示一个小数点,所以整体来看类型为P的字段初始值还是0):
向表中插入初始行后,字符字段全为一个空格,数字类型为0:
20.17.3.2.读取数据
CLEAR: wa_strc.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF wa_strc FROM ytest2.
得到的结果与上面插入数据一样。即使手动将数据库中的一个空格修改成多个,还是能读取出来恢复成插入时的初始数据。另外,以下SQL还是能读出数据:
SELECT SINGLE * INTO CORRESPONDING FIELDS OF wa_strc FROM ytest2 WHERE
key1 eq '' and key1 eq ' ' and key1 eq ' ' 分别为一个、两个、三个空格
但如果加上 key1 is null,则查询不出数据。
由此可以看出,数据库中的默认值加载到ABAP内存中后,也会转换成相应ABAP程序内置类型相应的初始值
20.17.4. SAP系统中的表字段不允许为NULL的原因
下面VAL2字段值为NULL时,使用 val2 <> 33 查询时,VAL2为NULL值是查询不出来的(标准SQL语句就是这样):
20.18. ABAP中的“空”、INITIAL
DATA: n(4) TYPE n VALUE '0000'.
IF '' = ' ' AND '' = 0 AND ' ' = 0 AND '' IS INITIAL AND ' ' IS INITIAL AND 0 IS INITIAL AND n IS INITIAL.
WRITE: 'IS INITIAL'. 以上条件为真
ENDIF.
但'0000'数字常量串不能视为初始,下面条件也为真:
IF '' <> '0000' AND ' ' <> '0000' AND '0000' IS NOT INITIAL.
当查询某个表时,如果要判断某个字段是否为空,则要使用是否等于' '空格(''空字符也行)来判断(XX EQ ' '如果是数字类型,则需要与0进行对比),而不能使用 is NULL来查询,因为SAP中的表字段几乎没有为NULL的,基本上都是一个空格,所以不能使用is NULL。从ST05可以看出:is NULL会原样写在SQL语句中,而空字符串或空格字符串都会转换成一个空格,这正好与数据库字符类型字段的默认字段对应:
SELECT SINGLE * FROM mara WHERE matnr IS NULL OR matnr = '' OR matnr = ' ' OR matnr = ' '.
SELECT WHERE "MANDT" = '210' AND ( "MATNR" IS NULL OR "MATNR" = ' ' OR "MATNR" = ' ' OR "MATNR" = ' ' ) AND ROWNUM <= 1
另外,如果是查询条件字段是Date、Numc、QUAN类型时,Where条件后面的值不会使用引号引起来,而是把它们直接看作是数字类型,特别是Date与Numc类型,所对应的数据库表字段的类型为Nvarchar,这样在查询时会先将数据库表字段的值转换为数字类型后再进行比较:
SELECT WHERE "MANDT" = '210' AND "MATNR" = 'FOOTBALL' AND "ERSDA" = 00000000 AND "LAEDA" = 20120511 AND "BLANZ" = 000 AND "COMPL" = 01 AND "BRGEW" = 0 AND "NTGEW" = 10
下面是此生成SQL的查询界面:
原文链接:https://www.cnblogs.com/jiangzhengjun/p/4265616.html
侵删
-
Oracle查询一个表字段插入另一个表
2019-08-26 09:49:56t.DATA_TYPE typeName,'1','0','0',stock_increment_num.nextval,null,'1','0' from (SELECT a.*,f.* from all_tab_columns a,FA_SYS_TABLES f WHERE a.TABLE_NAME='FA_STOCK_STORE' and f.NAME='FA_STOCK_STORE' ... -
怎样扩展数据表字段?如何安全拓展表字段
2020-09-15 09:17:41第2部分 数据库SQL语言怎样扩展数据表字段? 【文章摘要】 在通信类软件中,常常会与数据库打交道。由于需求变化,或者是程序优化升级等原因,对数据表字段进行扩展... -
Mysql数据表字段设置了默认值,插入的对象中没有为这个字段赋值,最后插入报错,说该字段的值不能为null。
2021-03-07 01:14:05这样就会出现一个问题,当实体对象中某个属性值为空时,对应的数据库的字段就会插入null值,而默认值是插入时不指定该字段,该字段的值才会取默认值。 所以这里我是向设置了默认值的字段插入了null,才导致出现上述... -
mysql5.7以上版本,表字段设置NOT NULL DEFAULT CURRENT_TIMESTAMP后,该字段传入null时保存时报错
2021-04-13 14:48:58原因:5.7以上版本数据库操作默认为严格模式,也就是哪怕设置了default值,该字段为not null。操作数据库为null时,也不会走default,会直接报错不可为空。 解决方式: 1.在mysql启动的配置文件中加上下面两句话: ... -
Mysql数据表字段设置了默认值,插入数据后默认字段的值却为null,不是默认值...
2019-09-29 19:06:07我将mysql的数据表的某个字段设置了默认值为1,当向该表插入数据的时候该字段的值不是默认值,...这样就会出现一个问题,当实体对象中某个属性值为空时,对应的数据库的字段就会插入null值,而默认值是插入时不指定... -
数据库:添加表字段
2022-01-18 09:50:49alter table <数据表名> add <字段名> <字段类型> null comment 'xxx'; -
Mybatis怎么插入字段为null的记录
2017-07-02 00:37:25问题:Mybatis在做数据插入时,我们插入的数据常常不是完整的,有些字段是要允许为空插入的,那么在Mybtis中如何设置呢? 第一步: insert into table_name(_id,username) values(_id = #{_id,jdbcType=INTEGER},... -
SQLServer 表字段为 NULL 而视图为NOT NULL 问题
2015-10-14 13:32:06由于字段[value]没有默认值,读取或插入数据时null改为0 : -- 由于字段[value]没有默认值,读取或插入数据时null改为0 ALTER VIEW [dbo].[VTestTable] AS SELECT [Identifier],[Name],ISNULL([value],0) ... -
sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中
2021-01-28 06:49:24/*============================================================================== * *Filename:sqllist.sql *Description:sql根据指定条件获取一个字段批量获取数据插入另外一张表字段中 *Version:1.0 *Created:... -
表字段长度问题
2022-02-19 15:20:22今天在做项目,发现一个问题,我的一个表字段是 `num` decimal(6,2) unsigned NOT NULL COMMENT '购买数量'; 我在代码里插入10000,竟然变成了9999.99,打印sql是没问题的。 原来decimal类型,插入的数字长度... -
mysql表字段说明
2021-01-19 13:28:273、表字段说明: 3.1、数字: 3.1.1、整型: 说明: 整型如果指定了AUTO_INCREMENT,则列必须为PRIMARY KEY 或UNIQUE 索引;如果指定了UNSIGNED属性,则相应的整数类型不允许取负值;如果指定了ZEROFILL 属性,则用... -
oracle 增加修改删除表字段,添加修改表、以及表中字段的备注
2020-12-29 04:53:15添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….);修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….);删除... -
TP5.o,数据表字段不存在
2020-04-12 17:35:18“数据表字段不存在:[group_id]”, _但是打印出来的表单数据是存在这个字段的,并且数据库表里字段也确定有对应的字段。大神可以帮忙解答一下是怎么回事麽?拜托了! 这是操作语句: ``` db('auth_group_... -
MySQL生产库中添加修改表字段引起主从崩溃的问题总结
2021-01-19 12:44:08查看变更完最后一批表后的binlog大小,其中mysql-bin.007759这一文件达到了将近9G,配置文件中限定产生的binlog文件的最大大小是1G 因为后面一批的表字段添加变更执行是一个事务,同一个事务产生的binlog不会被分配到... -
Oracle 删除添加表字段
2018-05-08 17:33:13原文:https://www.cnblogs.com/kobigood/p/6293955.html1.添加字段:alter table 表名 add (字段 字段类型) [ default '输入默认值'] [null/not null] ;2.添加备注:comment on column 库名.表名.字段名 is '输入... -
浅谈为什么Mysql数据库尽量避免NULL
2021-02-10 18:59:43在Mysql中很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。但我们常在一些Mysql性能优化的书或者一些博客中看到观点:在数据列中,尽量不要用NULL 值,... -
mysql数据表字段的类型和长度
2021-01-19 03:12:172017-01-22 回答"空值"是对null值的中文叫法,两者同指一个东西。弄清楚null(空值)与零长度字符串''(或称为空字符串)之间的区别。...在不存在约束限制的情况我们可以将null值插入任何数据类型的... -
MySql中为已有字段设置默认值(Default)及插入null后,默认值失效的问题
2021-09-27 20:19:581. 将表test中,已有的num字段,...此时我们发现num字段为插入的null,而并不是我们设置的默认值0 3.此时只插入name 此时我们可以看到“李四”的默认值变成了0。 结论:mysql 的默认值只有在insert语句中没有这... -
Mysql中表字段设置了默认值,插入数据后默认字段的值却为null,不是默认值的问题 随手记
2020-01-16 10:02:24最近在项目中遇到一个问题,我将Mysql中表的某个字段设置了一个默认值0,但是当向这张表插入数据时,这个...这样就会出现一个问题,当实体对象中某个属性值为空时,对应的数据库的字段就会插入null值,而默认值是插... -
DB2 修改表字段
2020-12-23 09:25:39去掉字段 alter table [table_name] drop column [column_name] 注意:drop掉字段之后,可能会导致表查询/插入操作不能执行,需要对表进行reorg。 4.为字段添加默认值 alter table [table_name] alter column [column_... -
添加表字段后提示表字段不存在
2019-11-04 17:53:27在原有表中新添加字段后,代码中报错unknow ...alter table trading_order add column order_type TINYINT(2) DEFAULT NULL COMMENT ‘订单类型:0-消费支付,2-充值’; 改成了ALTER TABLE trading_order ADD COLU... -
java根据xml中插入语句生成创建表字段
2020-08-21 16:53:53该文章主要内容 1.目前从工程的xml中生成sql是从sqlmapper的resultMap生成创建表语句 该方案有明显的局限性质, ...1.根据插入语句生成创建表语句,因为一个工程中插入数据的地方基本在一个文件,而且插入基本就是一