MYSQL允许我在PK和FK中插入空值

时间:2014-05-08 19:59:54

标签: mysql sql primary-key mysql-workbench

我一直在测试我正在做的数据库,我注意到它让我在作为主键一部分的字段中插入空值,尽管在脚本中声明该字段的值应为{ {1}}。我正在使用MAC的MySQL Workbench,我一直在谷歌上搜索,无法弄清楚为什么会这样。 (也许我现在太炒脑了......我甚至开始怀疑自己)

数据库创建的部分脚本(这些是我测试过的表...):

NOT NULL

它将让我创建没有CIF的客户," PersonaContacto"没有Cliente_CIF或没有" Nombre" ....

我还测试过我以前曾经使用的其他数据库,并且它们在所有数据库中都发生了相同的事情。

2 个答案:

答案 0 :(得分:1)

搞定了!!

我不知道我默认运行的是什么样的sql模式,但是这个:

SET sql_mode = TRADITIONAL;

它现在运行得很好!我不知道有不同的sql模式!非常感谢大家的时间和精力!它真的帮助我看到问题出在我的工作台上,而不是代码,并相应地寻找答案!我希望这个主题对我这样的未来初学者有用!

答案 1 :(得分:0)

如果存储在CIF列中的值实际上是NULL,则表达式LENGTH(CIF)也应返回NULL。 (如果它是一个零长度字符串,则LENGTH(CIF)将返回0.

验证:

SELECT c.CIF, LENGTH(c.CIF) FROM solytierra.Cliente c ;

SELECT c.CIF FROM solytierra.Cliente c WHERE c.CIF IS NULL;

如果您正在运行INSERT语句,我无法解释您正在观察的行为,MySQL允许存储NULL值 MySQL提供隐式默认值。)< / p>

如果它是一个存储零长度字符串,那么如果列没有显式声明为NOT NULL但后来被声明为主键的一部分,那么我们就会期望这种行为。如果列定义NOT NULL DEFAULT '',它也是我们所期望的行为。

当从列声明中省略NOT NULL并且该列稍后被声明为PRIMARY KEY的一部分时,MySQL将使用基于列的数据类型的隐式默认值(零长度字符串为VARCHAR,整数为零等等。)

但我无法使用您发布的表格定义重现您报告的问题。

我建议您通过以下方式检查表定义:

SHOW CREATE TABLE solytierra.Cliente;