MYSQL允许我在PK和FK中插入空值
我一直在测试我现在正在做的一个数据库,我注意到它允许我将null值插入到作为主键一部分的字段中,尽管脚本中声明字段的值不应为null。我正在使用MAC的MySQL工作台,我一直在谷歌搜索,不知道为什么会发生这种情况。也许我现在太激动了。。。我甚至开始怀疑自己 数据库创建脚本的一部分这些是我测试过的表..: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
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