约束

postgresql中约束分为五种:

1.检查约束  分为:字段检查和表检查两种

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);
如上表所示:头两个约束是字段检查约束,最后一个是表检查约束

2.非空约束  字段后面直接跟not null

CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric
);

当然,一个字段可以有多个约束。只要在一个接着一个写就可以了:

CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric NOT NULL CHECK (price > 0)
);

它的顺序无所谓。顺序并不影响约束检查的顺序。

提示: 在大多数数据库设计里,主要的字段都应该标记为非空。

 

3.唯一性约束

CREATE TABLE products (
    product_no integer UNIQUE,
    name text,
    price numeric
);

上面是写成字段约束,下面这个

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    UNIQUE (product_no)
);

是写成表约束。

如果一个唯一约束引用一组字段,那么这些字段用逗号分隔列出:

CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, c)
);

这样就声明了指定字段的数值的组合,在整个表的范围内是唯一的, 不过这些字段中的某个的数值可以不必是(并且通常也的确可能不是)唯一的。

4.主键

从技术上来讲,主键约束只是唯一约束和非空约束的组合。 所以,下面两个表定义接受同样的数据:

CREATE TABLE products (
    product_no integer UNIQUE NOT NULL,
    name text,
    price numeric
);
CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

主键也可以约束多于一个字段;其语法类似唯一约束:

CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    PRIMARY KEY (a, c)
);

主键表示一个字段或者是若干个字段的组合可以用于表中的数据行的唯一标识。 (这是定义一个主键的直接结果。请注意一个唯一约束实际上并不能提供一个唯一表示,因为它不排除空值。) 这个功能对文档目的和客户应用都很有用。比如,一个可以修改行数值的 GUI 应用可能需要知道一个表的主键才能唯一地标识一个行。

5.外键

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products,
    quantity integer
);
 

一个外键也可以约束和引用一组字段。同样,也需要写成表约束的形式。 下面是一个捏造出来的语法例子:

CREATE TABLE t1 (
  a integer PRIMARY KEY,
  b integer,
  c integer,
  FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
);
 

我们知道外键不允许创建和任何产品都无关的订单。 但是如果一个订单创建之后,而其引用的产品被删除了会怎么办? SQL 也允许你处理这个问题。简单说,我们有几种选择:

  • 不允许删除一个被引用的产品

  • 同时也删除订单

  • 其它的?

为了说明这个问题,让我们对上面的多对多的关系例子制定下面的 策略:如果有人想删除一种仍然被一个订单引用的产品(通过order_items),那么我们不允许她这么做。 如果有人删除了一个订单,那么订单项也被删除。

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    order_id integer REFERENCES orders ON DELETE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);

限制和级联删除是两种最常见的选项。RESTRICT 禁止删除被引用的行。 NO ACTION 的意思是如果在检查约束的时候,如果还存在任何引用行,则抛出错误; 如果你不声明任何东西,那么它就是缺省的行为。 (这两个选择的实际区别是,NO ACTION 允许约束检查推迟到事务的晚些时候,而 RESTRICT 不行。) CASCADE 声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。 在外键字段上的动作还有两个选项: SET NULL 和 SET DEFAULT。 这样会导致在被引用行删除的时候,引用它们的字段分别设置为空或者缺省值。 请注意这些选项并不能让你逃脱被观察和约束的境地。 比如,如果一个动作声明 SET DEFAULT,但是缺省值并不能满足外键,那么动作就会失败。

类似 ON DELETE,还有 ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的。可用的动作是一样的。

你可能感兴趣的:(约束)