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)
);
注意:在最后一个表中主键和外键之间有重叠。