在mariadb中获取检查约束定义

时间:2018-07-21 08:24:19

标签: mariadb check-constraints

有什么方法可以获取mariadb中检查约束的定义吗? 例如, 在这样定义的约束中

CREATE TABLE `foo`.`bar` ( `a` INT(12) NOT NULL , CONSTRAINT `a` CHECK (`a` >= '12'));

我想获得( a >= '12')的定义。

我知道它将有关此约束的信息存储在information_schema.table_constraints中,但不存储定义。

但是数据库的mysqldump也显示检查约束语句,因此它必须将其存储在某个地方,有什么方法可以获取它吗?

1 个答案:

答案 0 :(得分:0)

MariaDB 10.2 CHECK and DEFAULT clauses(Percona数据库性能博客)所述,获得这些信息似乎并不容易:

  

另一个限制是,CHECK元数据无法通过   INFORMATION_SCHEMA。找出表是否具有CHECK的唯一方法   子句正在解析SHOW CREATE TABLE的输出。

已经有任务或功能要求,将其包含在将来的版本中,请参见INFORMATION_SCHEMA.CHECK_CONSTRAINTS

一个想法是,Introduction to the CONNECT Engine在这里CONNECT engine的使用可能是有用的:

MariaDB [none]> SELECT VERSION();
+------------------+
| VERSION()        |
+------------------+
| 10.3.8-MariaDB-1 |
+------------------+
1 row in set (0.000 sec)

MariaDB [none]> SHOW ENGINES;
+--------------------+-----
| Engine             | ... 
+--------------------+-----
| MRG_MyISAM         | ... 
| CSV                | ... 
| MEMORY             | ... 
| MyISAM             | ...
| CONNECT            | ...
| Aria               | ...
| InnoDB             | ...
| PERFORMANCE_SCHEMA | ...
| SEQUENCE           | ...
+--------------------+-----
9 rows in set (0.000 sec)

MariaDB [(none)]> CREATE SERVER `_`
    -> FOREIGN DATA WRAPPER MYSQL
    -> OPTIONS
    -> (
    ->   HOST '<YOUR_IP>'
    -> , USER '<YOUR_USER>'
    -> , PASSWORD '<YOUR_PASSWORD>'
    -> , PORT <YOUR_PORT>
    -> , DATABASE '<YOUR_SCHEMA>'
    -> );
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> USE `_`;
Database changed

MariaDB [_]> CREATE OR REPLACE TABLE `bar` (
    ->   `a` INT(12) NOT NULL,
    ->   CONSTRAINT `a` CHECK (`a` >= '12')
    -> );
Query OK, 0 rows affected (0.003 sec)

MariaDB [_]> CREATE OR REPLACE TABLE `show_create_table`
    ->   ENGINE=CONNECT
    ->   TABLE_TYPE=MYSQL
    ->   SRCDEF='SHOW CREATE TABLE `bar`'
    ->   CONNECTION='_';
Query OK, 0 rows affected (0.002 sec)

MariaDB [_]> SELECT TRIM(
    ->   LEADING 'CHECK ' FROM
    ->     REGEXP_SUBSTR(
    ->       (SELECT `Create table`
    ->       FROM `show_create_table`),
    ->       'CHECK[^\\n]*'
    ->     )
    -> ) `CHECK`;
+---------------+
| CHECK         |
+---------------+
| (`a` >= '12') |
+---------------+
1 row in set (0.001 sec)

在这里,您将不得不根据需要的复杂性来修改正则表达式。