MySql:向空值添加非空约束传递?

时间:2016-01-07 09:56:17

标签: mysql sql junit

我对一些本地传递的mysql代码进行了JUnit测试,但在服务器上运行时失败了。 本地我使用的是Windows 7,服务器是Ubuntu 14.04。两者都运行MySql 5.6。

我有一个带有空值的char列,并尝试在其上放置一个非空约束。在本地,这应该失败,但在服务器上我只得到一个警告,但它通过,并将空值设置为空字符串。 (见图片) 我假设这是mysql服务器配置的一些区别? 我是MySql的新手,无法找到解决方法。

示例图像:向上是服务器,向下是本地:

Example image: up is server, down is local

1 个答案:

答案 0 :(得分:1)

首先检查:

SELECT @@sql_mode;

你可能会得到:

STRICT_TRANS_TABLES/STRICT_ALL_TABLES


UP env :   -------
DOWN env:   STRICT_..._TABLES

区别在于错误与警告

enter image description here

Modes

  

严格模式控制MySQL处理无效或缺失值的方式   数据更改语句,如INSERT或UPDATE。值可以是   因几个原因无效。例如,它可能包含错误的数据   列的类型,或者可能超出范围。缺少值   当要插入的新行不包含非NULL值时   在其定义中没有显式DEFAULT子句的列。 (为一个   NULL列,如果缺少值,则插入NULL。)

SqlFiddleDemo

解决问题的正确方法是首先在更改架构之前将NULL更新为空字符串。

CREATE TABLE test_table(primary_key INT AUTO_INCREMENT PRIMARY KEY,
                        short_char CHAR(100));

INSERT INTO test_table(short_char)
VALUES (NULL);

UPDATE test_table
SET short_char = ''
WHERE short_char IS NULL;

ALTER TABLE test_table modify short_char char(100) not null;

SqlFiddleDemo2

我建议使用VARCHAR(100)代替CHAR(100)