暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

数据库对象管理MySQL模式定义列的约束

2023-03-26
276

为了确保表里的数据符合业务规则,您可以在列上定义约束。

约束定义在列上,可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时,会触发一个错误并回滚这个操作;当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时,也会触发一个错误并回滚这个操作。

约束类型

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 affected
    

    OceanBase 数据库默认开启了外键约束检查,外键约束检查开关由租户变量 foreign_key_checks 来控制。更多 foreign_key_checks 变量的说明,请参见 foreign_key_checks

  • CHECK 约束:要求数据库中某列的值符合指定的条件。

查看约束

创建约束后,您可以通过视图 ALL_CONS_COLUMNSDBA_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;
    

示例如下:

  1. 创建表 tbl4

    obclient> CREATE TABLE tbl4(col1 INT,col2 INT);
    Query OK, 0 rows affected
    
  2. 为表添加主键。

    obclient> ALTER TABLE tbl4 ADD PRIMARY KEY(col1);
    Query OK, 0 rows affected
    
  3. 将表的主键列修改为 col2

    obclient> ALTER TABLE tbl4 MODIFY PRIMARY KEY(col2);
    
  4. 删除表中的主键。

    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;
    

示例如下:

  1. 创建表 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
    
  2. 为表 tbl6 添加外键约束。

    obclient> ALTER TABLE tbl6 ADD CONSTRAINT fk FOREIGN KEY(col4) REFERENCES  tbl5(col1);
    Query OK, 0 rows affected
    
  3. 删除表 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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论