为了确保表里的数据符合业务规则,您可以在列上定义约束。
约束定义在列上,可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时,会触发一个错误并回滚这个操作;当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时,也会触发一个错误并回滚这个操作。
约束类型
OceanBase 数据库的 Oracle 模式支持的约束类型如下:
非空约束(
NOT NULL):不允许约束包含的列的值为NULL。有非空约束的列,在
INSERT语句中必须指明该列的值,除非该列还定义了默认值。 创建表tbl1,并设置列col1为非空约束的示例如下:obclient> CREATE TABLE tbl1(col1 INT NOT NULL,col2 INT); Query OK, 0 rows affected obclient> DESC tbl1; +-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | COL1 | NUMBER(38) | NO | NULL | NULL | NULL | | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set唯一约束(
UNIQUE):不允许约束包含的列的值有重复值,但是可以有多个NULL值。例如,创建表
tbl2,并指定col1列的值唯一的示例如下:obclient> CREATE TABLE tbl2(col1 INT UNIQUE,col2 INT); Query OK, 0 rows affected obclient> desc tbl2; +-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | COL1 | NUMBER(38) | YES | UNI | NULL | NULL | | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set主键约束(
PRIMARY KEY):NOT NULL约束和唯一约束的组合。例如,创建表
tbl3,并指定col1列为主键列的示例如下:obclient> CREATE TABLE tbl3(col1 INT PRIMARY KEY,col2 INT); Query OK, 0 rows affected obclient> desc tbl3; +-------+------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+------------+------+-----+---------+-------+ | COL1 | NUMBER(38) | NO | PRI | NULL | NULL | | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+------------+------+-----+---------+-------+ 2 rows in set示例中,
col1列的值不允许为NULL并且必须是不重复的。外键约束(
FOREIGN KEY):要求约束的列的值取自于另外一个表的主键列。例如,创建表
tbl4并指定col2列关联另一个表tbl3的主键列col1。obclient> CREATE TABLE tbl4(col1 INT,col2 INT,FOREIGN KEY(col2) REFERENCES tbl3(col1)); Query OK, 0 rows affectedOceanBase 数据库默认开启了外键约束检查,外键约束检查开关由租户变量
foreign_key_checks来控制。更多foreign_key_checks变量的说明,请参见 foreign_key_checks。CHECK约束:要求数据库中某列的值符合指定的条件。
查看约束
创建约束后,您可以通过视图 ALL_CONS_COLUMNS、DBA_CONS_COLUMNS、 USER_CONS_COLUMNS 查询表中的约束。
示例如下:
obclient> SELECT * FROM USER_CONS_COLUMNS WHERE table_name='TBL3';
+-------+----------------------------+------------+-------------+----------+
| OWNER | CONSTRAINT_NAME | TABLE_NAME | COLUMN_NAME | POSITION |
+-------+----------------------------+------------+-------------+----------+
| SYS | TBL4_OBPK_1649992639477914 | TBL3 | COL1 | 1 |
+-------+----------------------------+------------+-------------+----------+
1 row in set
管理约束
管理主键约束
创建表后,您可以为表添加主键或修改表中的主键:
为已创建的表添加主键。
SQL 语法如下:
obclient> ALTER TABLE table_name ADD PRIMARY KEY(column_name);建议您在创建表时即为表添加主键。
修改表中的主键列。
SQL 语法如下:
obclient> ALTER TABLE table_name MODIFY PRIMARY KEY(column_name);删除表中的主键。
SQL 语法如下:
obclient> ALTER TABLE table_name DROP PRIMARY KEY;
示例如下:
创建表
tbl4。obclient> CREATE TABLE tbl4(col1 INT,col2 INT); Query OK, 0 rows affected为表添加主键。
obclient> ALTER TABLE tbl4 ADD PRIMARY KEY(col1); Query OK, 0 rows affected将表的主键列修改为
col2。obclient> ALTER TABLE tbl4 MODIFY PRIMARY KEY(col2);删除表中的主键。
obclient> ALTER TABLE tbl4 DROP PRIMARY KEY; Query OK, 0 rows affected
管理外键约束
创建表后,您可以对表中的外键进行以下操作:
对外键约束执行启用或禁用操作。
默认情况下,约束创建后为启用状态。如果在创建表时已添加了外键约束,则可以对这一约束执行启用或禁用操作。
SQL 语法如下:
obclient> ALTER TABLE table_name ENABLE | DISABLE CONSTRAINT constrain_name ;对已创建的表添加外键约束。
语法如下:
obclient> ALTER TABLE table_name1 ADD CONSTRAINT fk_name FOREIGN KEY (column_name1) REFERENCES table_name2(column_name2);其中:
table_name1表示待添加约束的表名;table_name2表示关联表的表名。fk_name表示待添加的外键约束的约束名。column_name1表示指定约束的列名;column_name2表示关联表主键列的列名。
删除表中的外键。
语句如下:
obclient> ALTER TABLE test DROP CONSTRAINT fk_name;
示例如下:
创建表
tbl5和tbl6。obclient> CREATE TABLE tbl5(col1 INT PRIMARY KEY,col2 INT); Query OK, 0 rows affected obclient> CREATE TABLE tbl6(col3 INT,col4 INT); Query OK, 0 rows affected为表
tbl6添加外键约束。obclient> ALTER TABLE tbl6 ADD CONSTRAINT fk FOREIGN KEY(col4) REFERENCES tbl5(col1); Query OK, 0 rows affected删除表
tbl6中的外键。obclient> ALTER TABLE tbl6 DROP CONSTRAINT fk; Query OK, 0 rows affected
管理 CHECK 约束
创建表后,支持对表中的CHECK 约束进行以下操作:
对
CHECK约束执行启用或禁用操作。如果在创建表时已添加了
CHECK约束,则可以对这一约束执行启用或禁用操作。SQL 语法如下:
obclient> ALTER TABLE table_name ENABLE | DISABLE CONSTRAINT constrain_name ;为已创建的表添加
CHECK约束。SQL 语法如下:
ALTER TABLE table_name ADD CONSTRAINT constrain_name CHECK(expression);示例如下:
obclient> ALTER TABLE ware ADD CONSTRAINT cst CHECK(w_city='hz');
管理非空约束
创建表后,支持对已创建的表添加或删除 NOT NULL 约束:
为已创建的表添加(
NOT NULL)约束。SQL 语法如下:
obclient> ALTER TABLE table_name MODIFY c1 NOT NULL;删除表的
NOT NULL约束。SQL 语法如下:
obclient> ALTER TABLE table_name DROP CONSTRAINT constraint_name;或者,您也可以使用以下语法来删除
NOT NULL约束:obclient> ALTER TABLE table_name MODIFY c1 NULL;
更多管理约束的语法及详细介绍请参见 ALTER TABLE。
关于时间列的默认时间设置
当列上有 NOT NULL 约束时,通常建议设置为默认值。当列类型是日期或时间类型时,可以设置默认值为数据库当前时间。
示例:为表的时间列设置默认值,可以使用 current_timestamp 函数。
obclient> CREATE TABLE t1(
id bigint not null primary KEY
, gmt_create datetime not null default current_timestamp
, gmt_modified datetime not null default current_timestamp
);
Query OK, 0 rows affected
obclient> INSERT INTO t1(id) VALUES(1),(2),(3);
Query OK, 3 rows affected
obclient> SELECT * FROM t1;
+----+---------------------+---------------------+
| id | gmt_create | gmt_modified |
+----+---------------------+---------------------+
| 1 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
| 2 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
| 3 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
+----+---------------------+---------------------+
3 rows in set



