我一直在测试我正在做的数据库,我注意到它让我在作为主键一部分的字段中插入空值,尽管在脚本中声明该字段的值应为{ {1}}。我正在使用MAC的MySQL Workbench,我一直在谷歌上搜索,无法弄清楚为什么会这样。 (也许我现在太炒脑了......我甚至开始怀疑自己)
数据库创建的部分脚本(这些是我测试过的表...):
NOT NULL
它将让我创建没有CIF的客户," PersonaContacto"没有Cliente_CIF或没有" Nombre" ....
我还测试过我以前曾经使用的其他数据库,并且它们在所有数据库中都发生了相同的事情。
答案 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;