一、主键:标记数据唯一非空,一个表最多只能有一个主键。
CREATE TABLE products (
product_no integer PRIMARY KEY, --主键约束,保证唯一且非空。
-- 或者 product_no integer UNIQUE NOT NULL,
name text,
price numeric
);
二、外键: 标记数据依赖其他表。
-- 和主表关系,一般是多对一关系。
CREATE TABLE orders (
order_id integer PRIMARY KEY,
-- 订单表的外键————参照引用了产品表的主键,这样 product_no 也拥有唯一非空特征的了。
-- orders 实体表(或称目标表、引用表、从表、子表)中的 product_no 字段数据,对应着
-- products 参照表(或称来源表、被引用表、主表、父表)中的 product_no 数据,那么:
-- 1. 不可能创建包含不存在于来源表(产品表)中的 product_no 值(非空)的订单。
-- 2. 当前orders 实体表有使用来源表数据,来源表则不许删除此 product_no,以约束数据完整性。
-- 3. 通俗地说,有父项值才能有子项值;有子项值时限制删除、更新父项值。
product_no integer REFERENCES products (product_no) ON DELETE NO ACTION ON UPDATE NO ACTION,
quantity integer
);
三、唯一约束:标记数据不重复,可以有任意数量的唯一和非空约束。
CREATE TABLE products (
product_no integer,
--产品名称具有唯一性,即不重复。
name text UNIQUE,
price numeric
);
四、外键约束+唯一约束,创建表映射关系:
一个Hibernate创建表关联约束的例子:
// Hibernate: param 主表建立唯一约束
alter table param
add constraint UK_57qbh4dmhu9uqd46oc65lvx5j unique (param_1)
// Hibernate: season 从表建立外键
alter table season
add constraint FKbl4vs03v96gemvp8gfjv7qmr
foreign key (season)
references param (param_1)
如果创建实体表 FK外键时,实体表已经有的数据不在参照表中,那到将会报错。
五、外键约束限制:(父表删除或更新操作时,父表和子表的操作类型)
类型 | ON DELETE | ON UPDATE | 说明 |
restrict (约束) | 当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。 | 当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。 | 不处理 |
no action | 意思同restrict,即如果存在从数据,不允许删除主数据。 | 意思同restric,即如果存在从数据,不允许更新主数据 | 不处理 |
cascade (级联) | 当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。 | 当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。 | 也处理 |
set null | 当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null) | 当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。 | 设Null |
setdefault |
| 默认值 |