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

SQL列定义:默认值和非null冗余吗?

华泳
2023-03-14
问题内容

我已经多次看到以下在create / alter DDL语句中定义列的语法:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

问题是:由于指定了默认值,是否还需要指定该列不应该接受NULL?换句话说,DEFAULT是否不使NOT NULL变得多余?


问题答案:

DEFAULT是在insert / update语句中没有显式值的情况下将要插入的值。让我们假设,您的DDL没有NOT NULL约束:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

然后你可以发表这些声明

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

另外,您还可以根据SQL-1992标准使用DEFAULTinUPDATE语句:

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

注意,并非所有数据库都支持所有这些SQL标准语法。添加NOT NULL约束将导致statement出错4, 6,而1-3, 5仍然是有效的statement。因此,请回答您的问题:不,它们不是多余的。



 类似资料:
  • 问题内容: 我正在尝试使用多个插入(在一条语句中),并且我具有此表结构 我的查询: 由于[StudentID]列不接受NULL,因此该语句(我预期是)应该失败。问题是MySQL在第2行中插入了空字符串(’‘)…,并允许其余的继续。 问题答案: 问题: 或放 下到(然后重新启动)。

  • spring-boot-starter-parent 2.4.1 spring-boot-starter-data-jpa postgres 12.5 一个实体的简短摘录: 该实体生成一个表,如下所示: 就是这样: 我们可以看到: null 问题 > 我想防止任何人设置Null,就像在branch1中那样。 如果我这样组织它: @columnDefinition=“varchar(255)defa

  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 我在MySQL数据库中有一个表,其中包含一个默认值的列,在数据库端使用phpMyAdmin定义。当我使用HiberNate插入新行时,我得到这个错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“status”不能为null 我还需要做些什么来使用默认值吗? 实体

  • 问题内容: 我执行选择以获取表的结构。我想获取有关列的信息,例如其名称,是否为null或是否为主键。 但是对于默认值,我得到的是id ..类似454545454的东西,但是我想得到的值是“ xxxx”。要搜索的表是什么,或者将该ID转换为值的函数是什么。谢谢 问题答案: 您可以执行此操作(只需执行SELECT *,这样您就可以看到所有可用信息): 结果集中包括“ COLUMN_DEFAULT”列。

  • 当我在JAX-RS中添加字符串的默认值时,它不接受该值。它保持为null或空。 当我将状态传递为空或或未定义时,它将保持为空或或未定义。它不会将默认值视为已确认。