有什么方法可以获取mariadb中检查约束的定义吗? 例如, 在这样定义的约束中
CREATE TABLE `foo`.`bar` ( `a` INT(12) NOT NULL , CONSTRAINT `a` CHECK (`a` >= '12'));
我想获得(
a >= '12')
的定义。
我知道它将有关此约束的信息存储在information_schema.table_constraints中,但不存储定义。
但是数据库的mysqldump也显示检查约束语句,因此它必须将其存储在某个地方,有什么方法可以获取它吗?
答案 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)
在这里,您将不得不根据需要的复杂性来修改正则表达式。