MySQL默认值对NULL的处理方式

12

我有以下表格:

CREATE TABLE `Foo` (
  `id`         int NOT NULL,
  `FirstName`  varchar(255) NULL,
  `LastName`   varchar(255) NOT NULL DEFAULT 'NONE',
  PRIMARY KEY (`id`)
);
当我运行以下查询时,它会使用默认值'NONE'
INSERT INTO Foo (`FirstName`) VALUES('FOO');

当我运行以下查询:

INSERT INTO Foo (`FirstName`, `LastName`) VALUES('FOO', NULL);

它会报错:

[Err] 1048 - 列 'LastName' 不能为空


我想要实现的是,如果一个值为NULL,那么MySQL应该使用默认值
有人知道解决方案吗?


2
因为您将姓氏定义为“非空”,所以出现了这种情况。 - Bhargav Chudasama
1
你定义表时指定该字段不能为空。默认值适用于空值,而不是null值。因此,如果您没有为该字段传递任何值,则默认值将为“NONE”。如果您传递了任何值,Mysql将检查该值(并失败,因为您指定了非空)。 - Lelio Faieta
@LelioFaieta 好的..我知道...但是告诉我解决方案,如果值为空,则数据库采用默认值..我不想删除空检查。 - Shahid Ghafoor
3个回答

3

尝试这个

使用NULL代替NOT NULL

CREATE TABLE `Foo` (
`id`  int NOT NULL ,
`FirstName`  varchar(255) NULL ,
`LastName`  varchar(255) NULL DEFAULT  'NONE' , 
PRIMARY KEY (`id`)
);

像这样的查询

使用DEFAULT而不是NULL

INSERT INTO Foo ( `FirstName`, `LastName` ) VALUES('FOO', DEFAULT);

2
当您使用 NULL 时,意味着您想将 NULL 设置为一个值,但对于 NOT NULL 列来说是不可能的。
您可以通过使用 DEFAULT 显式地插入默认值:
INSERT INTO Foo ( `FirstName`, `LastName` ) VALUES('FOO', DEFAULT);

1
但在运行时,无法检查哪个值为 null。因此,如果数据库接收到 null,则应采用默认值。 - Shahid Ghafoor
你需要在应用程序端检查值是否为空,如果是,则传递默认值。 - Lelio Faieta

1

尝试移除 NOT NULL 约束。

INSERT INTO Foo ( `FirstName`) VALUES('FOO');

当您没有手动插入任何值到lastname时,您实际上会将'none'(默认值)插入到您的表中,因此NOT NULL约束条件得以通过。
INSERT INTO Foo ( `FirstName`, `LastName` ) VALUES('FOO', NULL);

你在手动将NULL插入到lastname中,因此你实际上是在将NULL插入到你的表中,因此NOT NULL约束失败。

解决方案:

在插入表时使用COALESCE()函数,它将返回非空参数。

INSERT INTO Foo ( FirstName, LastName ) VALUES('FOO', COALESCE(@value, default));

我希望当值为空时,它应该采用默认值,这就是我想要实现的。 - Shahid Ghafoor
2
在插入表时使用COALESCE()函数,它将返回非空参数。INSERT INTO Foo ( FirstName, LastName ) VALUES('FOO', COALESCE(@value, default)); - kiran Biradar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接