Mysql 将表从一个MariaDB数据库克隆到另一个数据库,包括默认值、索引和触发器?

Mysql 将表从一个MariaDB数据库克隆到另一个数据库,包括默认值、索引和触发器?,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,我想将一个表(包括其索引和触发器)从一个数据库复制到另一个数据库。这并不像我希望的那样简单。下面是一个示例。首先,我的MariaDB版本: $ mysql --version mysql Ver 15.1 Distrib 10.0.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 接下来,第一个表: CREATE DATABASE db1; USE db1; CREATE TABLE tb1 (id INT NOT NU

我想将一个表(包括其索引和触发器)从一个数据库复制到另一个数据库。这并不像我希望的那样简单。下面是一个示例。首先,我的MariaDB版本:

$ mysql --version
mysql  Ver 15.1 Distrib 10.0.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
接下来,第一个表:

CREATE DATABASE db1;
USE db1;
CREATE TABLE tb1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    word VARCHAR(50) NOT NULL);
INSERT INTO tb1 (word) VALUES ('foo');
DELETE FROM tb1 WHERE word='foo';
DELIMITER $$CREATE TRIGGER before_word_insert BEFORE INSERT ON tb1 FOR EACH ROW
    BEGIN
        SET NEW.word=TRIM(NEW.word);
        IF NOT (NEW.word REGEXP '^[[:alpha:]]+$') THEN
            SIGNAL SQLSTATE '12345' SET MESSAGE_TEXT = 'Invalid word';
        END IF;
    END$$
DELIMITER ;INSERT INTO tb1 (word) VALUES ('foo');
DESCRIBE tb1;
SHOW TRIGGERS;
SHOW INDEX FROM tb1;
最后三行给出:

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| word  | varchar(50) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

+--------------------+--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| Trigger            | Event  | Table | Statement                                                                                                                                                | Timing | Created | sql_mode | Definer        | character_set_client | collation_connection | Database Collation |
+--------------------+--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
| before_word_insert | INSERT | tb1   | BEGIN SET NEW.word=TRIM(NEW.word); IF NOT (NEW.word REGEXP '^[[:alpha:]]+$') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid word'; END IF; END | BEFORE | NULL    |          | root@localhost | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+--------------------+--------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+----------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.04 sec)

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tb1   |          0 | PRIMARY  |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
到目前为止,一切顺利。现在,要将
tb1
复制到另一个数据库(在同一台服务器上):

我曾希望最后三行能够提供与
db1
相同的输出,但它们没有:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | 0       |       |
| word  | varchar(50) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Empty set (0.00 sec)

Empty set (0.00 sec)
换句话说,
创建表db2.tb1作为SELECT*FROM db1.tb1

  • 复制表格内容
  • 复制列类型
  • 未复制密钥属性
  • 未复制“默认”属性
  • 未复制“额外”属性
  • 未复制触发器;及
  • 没有复制索引
我的问题:从db1.tb1创建表db2.tb1作为SELECT*是否会复制所有缺失的项目

CREATE TABLE newTable LIKE oldTable
应该包括索引和设置,但不包括数据和触发器

之后,您需要复制数据:

INSERT INTO newTable SELECT * FROM oldTable
触发器不是表的直接部分,而是脚本管理的一部分

您可以在
信息\u schema.triggers
中找到触发器。在那里,您可以查询表的每个触发器集。但我强烈建议不要手动乱动那张桌子

相反,您可以阅读此处的定义,并使用
SHOW create trigger
create trigger
创建新触发器。这涉及到动态sql或能够操作sql的客户机(应该应用于每个客户机)

如果有客户端连接到源数据库和目标数据库,则可以执行以下操作:

SELECT `TRIGGER_NAME` FROM information_schema.triggers WHERE `TRIGGER_SCHEMA` = database() AND `EVENT_OBJECT_TABLE` = oldTableName
正如您在评论中所述,您还可以使用

SHOW TRIGGERS WHERE `Table` = "oldTable"
而不是读取触发器表。作为旁注,
Table
周围的这些反勾非常重要,因为
Table
是一个保留字,在这里以类似列名的方式使用

使用触发器名称,为每个触发器投下一个

SHOW CREATE TRIGGER triggerNameFromQueryAbove
这将为您提供create语句,您可以使用该语句在新数据库中创建触发器。但要小心:可能包含数据库名称和定义者,而新数据库中可能不存在这些名称和定义者,因此必须手动删除这些信息


有关“触发器”表的更多信息,请阅读mysql手册(该手册也应适用于mariadb):

我在看这个问题,因为我有相同的问题。我有点沮丧,如果真的没有更简洁的命令来做这件事。我想指出一个(也许是显而易见的)也会起作用的程序。您可以将数据库转储到一个文件(“dumpdb1.sql”),如果您使用mysqldump进行备份,该文件已经很方便了。当然,您可以从dumpdb1.sql中复制相关文本,该文本创建tb1,设置其约束和索引,并添加其触发器和数据,将此摘录放入文件“buildtb1.sql”中。最后,只需在db2上运行后一个文件,就可以在那里获得tb1的完整拷贝


此外,我在MariaDB文档中看到:他们指出了ShowCreateTable语句在这方面的有用性。它将提供一个CREATETABLE语句,您可以在此过程中复制和使用该语句。如果您不想使用mysqldump方法,我只是将其作为mysqldump方法的一种替代方法。当然,SHOW CREATE TABLE不会描述触发器,所以您仍然需要执行SHOW triggers过程来捕获和复制这些触发器。

descripe tb1:db2结果与db1结果匹配<代码>显示触发器:提供空集<代码>显示来自tb1的索引:db2结果与db1结果匹配。总分:三分之二(而我的三分之零)。这是一个明显的进步,所以对你的答案投了赞成票。谢谢不过,如果能把触发器复制过来也很好。正如我所说的,触发器本身并不是表的一部分。我更新了我的答案,解释了一种获取触发器的方法。但你还是要创造它们。谢谢<代码>显示触发器,其中“Table`=“tb1”
似乎是获取适用于给定表的所有触发器的最简洁的方法(在本例中,Table
tb1
)。(顺便说一句,
Table
周围的反勾号似乎很重要:
在“Table”=“tb1”
不起作用的地方显示触发器。在某个时候,我将了解为什么会这样,但现在不是。)在
mysql
客户端中,您可以在命令末尾使用
\G
,而不是
它将导致不同的输出格式。也许这对你有帮助。你到底想做什么?例如,如果要复制整个数据库,请使用
mysqldump dbName--routines--triggers>outfile.sql
并将outfile.sql导入新数据库。它包括所有内容。@Psi,我想做的事情正如标题和问题中所述:我想将一个表从一个数据库克隆到另一个数据库,包括应用于源表的默认值、触发器和索引。当然可以,但只有那个表,或者可能那个表是数据库中唯一的表,因此,您可以克隆整个数据库。在我的示例中,源表确实是源数据库中唯一的表,但这只是为了使示例保持最小。在现实生活中,源表可能是源数据库中许多表中的一个,我不希望克隆其他表。好吧,那么转储整个数据库就不是一个真正的选择。我再次更新了我的答案,告诉你可以做什么。最简单的方法是使用mysqldump
SHOW CREATE TRIGGER triggerNameFromQueryAbove