gbase8s 常见表约束介绍
1 check 约束
语法
oracle 模式
CREATE TABLE haha (
c1 int,
c2 int CONSTRAINT check_c2 CHECK (c2 > 100)
);
gbase 模式
create table haha (
c1 int,
c2 int,
CONSTRAINT check_c2 CHECK (c2 > 100)
)
存储位置
check 约束信息存储于 sysconstraints 表中 约束表达式 存储于 syschecks表中,constrid 进行关联
2 default 值
语法
create table hehe (c1 int default 1,c2 date default sysdate);
存储位置
default 信息存储于 sysdefaults表中, default表达式 存储于 sysdefaultsexpr 表中 tabid进行关联
3 虚拟列
语法
create table tcs
(
c1 integer,
newid generated always as (round((c1 / 12 ) , 2 ) ) virtual
);
存储位置
虚拟列信息存储于 sysdefaultsexpr 表中
4 非空约束
语法
create table notnu (c1 int not null,c2 varchar2(20) not null);
存储位置
存储于 sysconstraints 表中 constrtype='N'
5 唯一约束
语法
oracle模式
创建时包含
CREATE TABLE tho (
id int CONSTRAINT tho_id_unique UNIQUE, --显示命名
name VARCHAR(100) UNIQUE, --系统隐式命名
c3 VARCHAR(100),
c4 VARCHAR(100)
);
现有表添加唯一约束
ALTER TABLE tho ADD CONSTRAINT tho_c34_name UNIQUE (c3,c4);
gbase 模式
CREATE TABLE thg (
id int UNIQUE CONSTRAINT thg_id_unique , --显示命名
name VARCHAR(100) UNIQUE, --系统隐式命名
c3 VARCHAR(100),
c4 VARCHAR(100)
);
现有表添加唯一约束
ALTER TABLE thg ADD CONSTRAINT UNIQUE (c3, c4) CONSTRAINT tho_c34_name1;
存储位置
存储于sysconstraints 表中 constrtype='U' 对应索引信息存储于 sysindexes idxname进行关联
6 主键约束
语法
oracle 模式
CREATE TABLE orapri (
id int CONSTRAINT orapri_pk PRIMARY KEY,
last_name VARCHAR(50)
);
ALTER TABLE orapri ADD CONSTRAINT orapri_pk PRIMARY KEY (id);
gbase模式
CREATE TABLE orapri1 (
id int PRIMARY KEY CONSTRAINT orapri_pk1 ,
last_name VARCHAR(50)
);
ALTER TABLE orapri ADD CONSTRAINT PRIMARY KEY (id) CONSTRAINT orapri_pk ;
存储于sysconstraints 表中 constrtype='P' 对应索引信息存储于 sysindexes idxname进行关联
7 外键约束
语法
oracle 模式下
1 使用外键关联父表主键
-- 父表
CREATE TABLE departments (
dept_id int PRIMARY KEY,
dept_name VARCHAR(100)
);
-- 子表
CREATE TABLE employees (
emp_id int PRIMARY KEY,
dept_id int REFERENCES departments(dept_id)
);
1 使用外键关联父表唯一约束
-- 父表
CREATE TABLE departments1 (
dept_id int UNIQUE,
dept_name VARCHAR(100)
);
-- 子表
CREATE TABLE employees1 (
emp_id int PRIMARY KEY,
dept_id int REFERENCES departments(dept_id)
);
gbase 模式下
1 使用外键关联父表主键
-- 父表
CREATE TABLE departmentsg (
dept_id int PRIMARY KEY,
dept_name VARCHAR(100)
);
-- 子表
CREATE TABLE employeesg (
emp_id int PRIMARY KEY,
dept_id int REFERENCES departments(dept_id)
);
1 使用外键关联父表唯一约束
-- 父表
CREATE TABLE departmentsg1 (
dept_id int UNIQUE,
dept_name VARCHAR(100)
);
-- 子表
CREATE TABLE employeesg1 (
emp_id int PRIMARY KEY,
dept_id int REFERENCES departments(dept_id)
);
存储于sysconstraints 表中 constrtype='R' 对应索引信息存储于 sysindexes idxname进行关联
/*idxname 如果是系统生成则 前边有个空格 例如 " 1108_71" */
8 唯一索引
CREATE UNIQUE/DISTINCT INDEX idxname ON tabname (colname);
唯一索引与唯一约束的区别
相同点 二者都是通过索引结构来保证唯一性
不同点
创建方式不同
存储系统表不同
触发方式不同
唯一约束会在语句末尾被检查
唯一索引是一行一行的检查
例如
create table oo (c1 int,c2 int);
insert into oo select level,level from dual connect by level <4;
create unique index idx_oo_c1 on oo(c1);
alter table oo add constraint unique (c2) constraint ooc2;
update oo set c1=c1+1; --报错 duplicate value for a record with unique key
update oo set c2=c2+1; --正常