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

MYSQL允许我在PK和FK中插入空值,mysql,sql,primary-key,mysql-workbench,Mysql,Sql,Primary Key,Mysql Workbench,我一直在测试我现在正在做的一个数据库,我注意到它允许我将null值插入到作为主键一部分的字段中,尽管脚本中声明字段的值不应为null。我正在使用MAC的MySQL工作台,我一直在谷歌搜索,不知道为什么会发生这种情况。也许我现在太激动了。。。我甚至开始怀疑自己 数据库创建脚本的一部分这些是我测试过的表..: DROP DATABASE IF EXISTS solytierra ; CREATE DATABASE IF NOT EXISTS solytierra DEFAULT CHARACTER

我一直在测试我现在正在做的一个数据库,我注意到它允许我将null值插入到作为主键一部分的字段中,尽管脚本中声明字段的值不应为null。我正在使用MAC的MySQL工作台,我一直在谷歌搜索,不知道为什么会发生这种情况。也许我现在太激动了。。。我甚至开始怀疑自己

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

DROP DATABASE IF EXISTS solytierra ;
CREATE DATABASE IF NOT EXISTS solytierra DEFAULT CHARACTER SET latin1 COLLATE       latin1_swedish_ci ;
USE solytierra ;


DROP TABLE IF EXISTS solytierra.Cliente ;
CREATE TABLE IF NOT EXISTS solytierra.Cliente (
CIF VARCHAR(25) NOT NULL,
Nombre VARCHAR(100) NULL,
EmailGeneral VARCHAR(45) NULL,
Web VARCHAR(45) NULL,
Notas VARCHAR(150) NULL,
insertado Timestamp,
CONSTRAINT pk_Cliente PRIMARY KEY (CIF)
)  ENGINE=InnoDB;


DROP TABLE IF EXISTS solytierra.PersonaContacto ;
CREATE TABLE IF NOT EXISTS solytierra.PersonaContacto (
Cliente_CIF VARCHAR(25) NOT NULL,
Nombre VARCHAR(50) NOT NULL,
Apellidos VARCHAR(100) NOT NULL,
Notas VARCHAR(150) NULL,
CONSTRAINT pk_PersonaContacto PRIMARY KEY (Cliente_CIF , Nombre , Apellidos),
CONSTRAINT fk_PersonaContacto_Cliente FOREIGN KEY (Cliente_CIF)
    REFERENCES solytierra.Cliente (CIF)
    ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=InnoDB;

...
它将让我创建没有CIF的客户,没有客户CIF或没有名字的PersonalContacto


我还测试了我已经使用过的其他数据库,在所有数据库中都是如此。

如果CIF列中存储的值实际上是NULL,那么表达式LENGTHCIF也应该返回NULL。如果它是长度为零的字符串,那么LENGTHCIF将返回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允许存储空值,要么MySQL提供隐式默认值

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

当从列声明中省略NOTNULL,并且该列稍后被声明为主键的一部分时,MySQL将根据VARCHAR的列零长度字符串、整数的列零长度字符串等的数据类型使用隐式默认值

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

我建议您通过从以下位置获取输出来检查表定义:

SHOW CREATE TABLE solytierra.Cliente;
明白了

我不知道默认情况下运行的是哪种sql模式,但使用以下方法:

SET sql_mode = TRADITIONAL;

它现在运行得很好!我不知道有不同的sql模式!非常感谢大家的时间和努力!它确实帮助我发现问题出在我的工作台上,而不是代码上,并据此寻找答案!我希望这个帖子对像我这样的未来初学者有用

但它让我可以做这样的事情:插入客户名称、电子邮件、Web、Notasvalues'pepito'、'irenea@hotmail.com","www.as.com","fdgfh",;这是正确的吗??我忘了去年所有的数据库课程表了吗?在哪里插入了空值?检查并选择该实际数据,以查看数据库中实际存在的数据。它是否可能插入了文本值“Null”而不是Null值?@HLGEM当我从该表中选择*时,它在CIF中不显示任何内容field@user286470它不会在CIF字段中输入Null,但它也不会显示任何内容……考虑到它与null不同,可能它插入了类似的内容?我在这里完全迷路了…非常感谢你的回答,谢谢!当运行最新语句时,我得到如下结果:CREATE TABLE Cliente CIF varchar25 NOT NULL、Nombre varchar100 DEFAULT NULL、EmailGeneral varchar45 DEFAULT NULL、Web varchar45 DEFAULT NULL、Notas varchar150 DEFAULT NULL、insertado timestamp NOT NULL DEFAULT CURRENT_timestamp ON UPDATE CURRENT_timestamp、,主键CIF ENGINE=InnoDB DEFAULT CHARSET=latin1,当我运行您发布的前两条语句时,它在CIF列下显示null