MySQL忽略NOT NULL约束

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模式

以上是 MySQL忽略NOT NULL约束 的全部内容, 来源链接: utcz.com/qa/418595.html

回到顶部