GBase 8c 数据定义-外键约束

    GBase 8c数据库支持外键约束。

    外键约束指定某列(或一组列)中的值必须匹配出现在另一表中某些行的值,这维持了两个关联表之间的引用完整性。

    例如使用过多次的表products:

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

假设还有一个存储这些产品订单的表。我们希望保证订单表中只包含真正存在的产品的订单。因此在订单表中定义一个引用产品表的外键约束:

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

    这样就不可能创建包含不存在于产品表中的product_no值(非空)的订单。

    在这种情况下,订单表是引用表而产品表是被引用表。相应地,也有引用和被引用列的说法。

    我们也可以把上述命令简写为:

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)
);

当然,被约束列的数量和类型应该匹配被引用列的数量和类型。

按照前面的方式,我们可以为一个外键约束命名。

每个表可以有多于一个的外键约束。这被用于实现表之间的多对多关系。例如有关于产品和订单的表,但现在希望一个订单能包含多种产品(这在上面的结构中是不允许的)。我们可以使用这种表结构:

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,
    order_id integer REFERENCES orders,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);

注意:在最后一个表中主键和外键之间有重叠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值