5.2. 默认值

一个列可以被分配一个默认值。当一个新行被创建且没有为某些列指定值时,这些列将会被它们相应的默认值填充。一个数据操纵命令也可以显式地要求一个列被置为它的默认值,而不需要知道这个值到底是什么(数据操纵命令详见 第六章:数据操纵 )。

如果没有显式指定默认值,则默认值是空值。这是合理的,因为空值表示未知数据。

  • 在一个表定义中,默认值被列在列的数据类型之后。例如:
    CREATE TABLE products (
        product_no integer,
        name text,
        price numeric DEFAULT 9.99
    );
    

默认值可以是一个表达式,它将在任何需要插入默认值的时候被实时计算(是表创建时)。一个常见的例子是为一个timestamp列指定默认值为CURRENT_TIMESTAMP,这样它将得到行被插入时的时间。另一个常见的例子是为每一行生成一个"序列号" 。这在**PostgreSQL**可以按照如下方式实现:

CREATE TABLE products (
    product_no integer DEFAULT nextval('products_product_no_seq'),
    ...
);
  • 这里nextval()函数从一个序列对象 9.16. 序列操作函数 )。还有一种特别的速写:
    CREATE TABLE products (
        product_no SERIAL,
        ...
    );
    

SERIAL速写将在 8.14. JSON 类型 进一步讨论。

下一节:数据类型是一种限制能够存储在表中数据类别的方法。但是对于很多应用来说,它们提供的约束太粗糙。例如,一个包含产品价格的列应该只接受正值。但是没有任何一种标准数据类型只接受正值。另一个问题是我们可能需要根据其他列或行来约束一个列中的数据。例如,在一个包含产品信息的表中,对于每个产品编号应该只有一行。

到目前为止,SQL允许我们在列和表上定义约束。约束让我们能够根据我们的愿望来控制表中的数据。如果一个用户试图在一个列中保存违反一个约束的数据,一个错误会被抛出。即便是这个值来自于默认值定义,这个规则也同样适用。