当前位置: 首页 > 面试题库 >

MySQL忽略NOT NULL约束

李甫
2023-03-14
问题内容

NOT NULL在MySQL的某些列上创建了约束表。然后在PHP中,我编写了一个脚本,用于通过插入查询插入数据。当我省略NOT NULL此插入语句中的列之一时,我会期望收到来自MySQL的错误消息,并且我期望脚本会失败。相反,MySQL在NOT NULL字段中插入空字符串。在其他省略的字段中,数据为NULL,这很好。有人可以告诉我我做错了什么吗?

我正在使用此表:

CREATE TABLE IF NOT EXISTS tblCustomers (
  cust_id int(11) NOT NULL AUTO_INCREMENT,
  custname varchar(50) NOT NULL,
  company varchar(50),
  phone varchar(50),
  email varchar(50) NOT NULL,
  country varchar(50) NOT NULL,
  ...
  date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (cust_id)
) ;

这个插入语句:

$sql = "INSERT INTO tblCustomers (custname,company) 
        VALUES ('".$customerName."','".$_POST["CustomerCompany"]."')";
$res = mysqli_query($mysqli, $sql);

或使用绑定变量:

$stmt = mysqli_prepare($mysqli, "INSERT INTO tblCustomers (custname,company, email, country) VALUES (?, ?, ?, ?)");

mysqli_stmt_bind_param($stmt, 'ssss', $customerName, $_POST["CustomerCompany"], $_POST["CustomerEmail"], $_POST["AddressCountry"]);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);

问题答案:

如果确定未使用显式默认值,请检查严格模式:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

MySQL数据类型默认值

从MySQL 5.0.2开始,如果列定义不包含任何显式的DEFAULT值,则MySQL将按以下方式确定默认值:

如果该列可以采用NULL作为值,则使用显式的DEFAULT NULL子句定义该列。这与5.0.2之前的版本相同。

如果该列不能使用NULL作为值,则MySQL定义该列时不使用显式的DEFAULT子句。对于数据输入,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将该列设置为NULL,则MySQL将根据当时有效的SQL模式处理该列:

  • 如果未启用严格的SQL模式,则MySQL将列设置为列数据类型的隐式默认值。

* 如果启用严格模式,则事务表将发生错误,并且该语句将回滚。对于非事务处理表,会发生错误,但是如果此错误发生在多行语句的第二行或后续行中,则会插入前面的行。

服务器SQL模式



 类似资料:
  • 我在一些字段上有@NotNull注释。然而,当我尝试生成diffChangelog时,它会删除所有非空约束 示例类: 差异集: 唯一的解决方案似乎是在每个字段上添加一个额外的注释@列(nullable=false)。我可以做任何事情,这样我就不必在每个字段上添加额外的注释。

  • 我有一个实体: 存储库: 应引发异常的测试: 然而,测试失败。实体不会引发所需的异常。注释适用于字符串,但不适用于整数。 MyEntity的自动生成表: 更新 当我将 指定到 字段时,一切正常。但是,我希望能够将自己的值分配给主键字段。 更新2 更新的实体(存储库也已更新以反映更改): MyEntity的自动生成表:

  • 我试图在wildfly上保护一个演示web应用程序。我已经在单机版中定义了这个安全域。xml 然后在web-inf下,我在web.xml中定义了这个安全约束 以及jboss网站上的这些内容。xml 问题是,如果我转到/projects URL,我不会重定向到登录页面,就好像忽略了约束一样。

  • 问题内容: 我有一个MySQL表来保存标签(即像在Stack Overflow上使用的那些标签)。它仅具有一个id(pk)和一个标签列来保存标签本身。 我的Tag实体的带注释的get方法如下所示。 我在标签上使用了唯一的列约束,因为给定标签的行不应超过一行。但是,Hibernate似乎忽略了这一点,即我可以多次保存完全相同的标签,并且它只是创建一个新行而不是抛出异常。 我是否缺少某些东西,还是应该

  • 问题内容: 我有一个电子邮件列,我想保持唯一性。但我也希望它接受空值。这样我的数据库可以有2个空电子邮件吗? 问题答案: 是的,MySQL在具有唯一约束的列中允许多个NULL。 结果: 并非对于所有数据库都是如此。 例如,SQL Server 2005和更早版本仅在具有唯一约束的列中允许单个NULL值。

  • 问题内容: 但是,当我删除WHERE时,查询会停止使用该键(即使我明确地强制使用该键也是如此) 有什么解决方法吗? 我意识到我在第二个示例中选择了整个表,但是为什么mysql突然决定它还是要忽略我的FORCE而不使用键?没有密钥,查询大约需要10分钟。 问题答案: FORCE有点用词不当。这是MySQL文档所说的(重点是我的): 您还可以使用FORCE INDEX,其作用与USE INDEX(in