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

标签 mysql sql primary-key mysql-workbench

我一直在测试我现在正在做的数据库,我注意到它允许我将空值插入到作为主键一部分的字段中,尽管在脚本中声明该字段的值应该是非空。我正在使用 MAC 的 MySQL Workbench,我一直在谷歌上搜索,但不明白为什么会发生这种情况。 (可能是我现在太烧脑了……我什至开始怀疑自己了)

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

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 的客户端、不带 Cliente_CIF 的“PersonaContacto”或不带“Nombre”的客户端....

我还测试了我已经使用过的其他数据库,并且所有这些数据库都发生了同样的情况。

最佳答案

明白了!!

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

SET sql_mode = TRADITIONAL;

现在运行完美!我不知道有不同的sql模式!非常感谢大家的时间和努力!它确实帮助我看到问题出在我的工作台中,而不是代码中,并相应地寻找答案!我希望这篇文章对像我这样的 future 初学者有用!

关于MYSQL 允许我在 PK 和 FK 中插入空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23551405/

相关文章:

php - ON DUPLICATE KEY UPDATE 创建新记录

php - 关键问题: Which key strategy should I use in my database?

java - 自定义 UUID 作为主键

mysql - 如何将一张表的所有数据移动到另一张表

php - 无法执行语句(42S22 - 1054 - '' 中的未知列 'field list')zf2

java - 处理 ResultSet 中意外返回的数据

sql - 如何从日期时间中删除时间

SQL 执行计划高成本 70%

php - 为什么此查询返回 2013 年的项目?

php - 来自 MySQL 的嵌套 JSON 数据