MySQL同时重命名和创建表

MySQL同时重命名和创建表,mysql,sql,mysql-event,Mysql,Sql,Mysql Event,我需要重命名MySQL表,同时创建一个新的MySQL表 存在具有大量记录的关键活动表master_table始终从脚本中插入记录 需要备份主表并同时创建另一个同名主表 一般SQL是这样的 RENAME TABLE master_table TO backup_table; Create table master_table (id,value) values ('1','5000'); 在执行上述查询期间,是否有可能记录缺失的数据 有没有办法避免丢失记录?锁定主表等。您可以不重命名主备份表并

我需要重命名MySQL表,同时创建一个新的MySQL表

存在具有大量记录的关键活动表master_table始终从脚本中插入记录

需要备份主表并同时创建另一个同名主表

一般SQL是这样的

RENAME TABLE master_table TO backup_table;

Create table master_table (id,value) values ('1','5000');
在执行上述查询期间,是否有可能记录缺失的数据


有没有办法避免丢失记录?锁定主表等。

您可以不重命名主备份表并重新创建它,而是 只需使用主表中的数据为第一次备份运行创建一个备份表

CREATE TABLE backup_table AS
   SELECT * FROM master_table;
如果必须向备份表中添加主键,请仅运行一次,即第一次备份:

ALTER TABLE backup_table ADD CONSTRAINT pk_backup_table PRIMARY KEY(id);
对于将来的备份,请执行以下操作:

INSERT INTO backup_table 
  SELECT * FROM master_table;
然后,您可以删除主\u表中备份\u表中的所有数据,如:

DELETE FROM master_table A JOIN 
       backup_table B ON A.id=B.id;
然后,您可以使用此查询将数据添加到master_表中:

INSERT INTO master_table (`value`) VALUES ('5000'); -- I assume the id field is auto_incrementable

我认为,即使不锁定主表,也应该可以完美地执行此操作,并且不会丢失执行。

您可以不重命名主备份表并重新创建它,而是 只需使用主表中的数据为第一次备份运行创建一个备份表

CREATE TABLE backup_table AS
   SELECT * FROM master_table;
如果必须向备份表中添加主键,请仅运行一次,即第一次备份:

ALTER TABLE backup_table ADD CONSTRAINT pk_backup_table PRIMARY KEY(id);
对于将来的备份,请执行以下操作:

INSERT INTO backup_table 
  SELECT * FROM master_table;
然后,您可以删除主\u表中备份\u表中的所有数据,如:

DELETE FROM master_table A JOIN 
       backup_table B ON A.id=B.id;
然后,您可以使用此查询将数据添加到master_表中:

INSERT INTO master_table (`value`) VALUES ('5000'); -- I assume the id field is auto_incrementable

我认为即使不锁定主表,也应该可以完美地工作,并且不会丢失执行。

我要做的是以下几点。它不会导致停机、数据丢失和几乎即时的执行

CREATE TABLE mytable_new LIKE mytable;

...possibly update the AUTO_INCREMENT of the new table...

RENAME TABLE mytable TO mytable_old, mytable_new TO mytable;
通过在一条语句中重命名两个表,它们可以原子地交换。当没有表接收写入时,不可能在“中间”写入任何数据。如果不以原子方式执行此操作,某些写入可能会失败

不管表有多大,重命名表实际上是即时的。您不必等待数据被复制

如果表有一个自动递增的主键,我希望确保新表以大于旧表中当前id的id值开始。在交换表名之前执行此操作

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable';
我想在这个值上增加一些舒适的余量。您希望确保插入到旧表中的id值不会超过从信息\u架构查询的值

更改新表以将此新值用于其下一个自动增量:

ALTER TABLE mytable_new AUTO_INCREMENT=<increased value>;
ALTER TABLE mytable_new AUTO_INCREMENT=;

然后立即执行重命名表以交换它们。一旦新行插入到新的空表中,它将使用以增加的自动增量值开始的id值,如果您及时执行这些步骤,该值应仍然大于插入到旧表中的最后一个id。

我所做的如下。它不会导致停机、数据丢失和几乎即时的执行

CREATE TABLE mytable_new LIKE mytable;

...possibly update the AUTO_INCREMENT of the new table...

RENAME TABLE mytable TO mytable_old, mytable_new TO mytable;
通过在一条语句中重命名两个表,它们可以原子地交换。当没有表接收写入时,不可能在“中间”写入任何数据。如果不以原子方式执行此操作,某些写入可能会失败

不管表有多大,重命名表实际上是即时的。您不必等待数据被复制

如果表有一个自动递增的主键,我希望确保新表以大于旧表中当前id的id值开始。在交换表名之前执行此操作

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable';
我想在这个值上增加一些舒适的余量。您希望确保插入到旧表中的id值不会超过从信息\u架构查询的值

更改新表以将此新值用于其下一个自动增量:

ALTER TABLE mytable_new AUTO_INCREMENT=<increased value>;
ALTER TABLE mytable_new AUTO_INCREMENT=;

然后立即执行重命名表以交换它们。一旦新行插入到新的空表中,它将使用从增加的自动增量值开始的id值,该值应仍然大于插入到旧表中的最后一个id,如果您及时执行了这些步骤。

为什么不直接复制表格?@jhpratt原始表格需要为空且不需要任何数据丢失?为什么不直接复制表格?@jhpratt原始表格需要为空且不需要任何数据丢失插入主表格(id,
)值('1','5000');如果在同一张桌子上重复练习,那么备份桌子的主键上是否存在潜在的重复?是的,是@PaulCampbell。我已经更新了我答案的这一部分。将值('1','5000')插入主表(id,
value
);如果在同一张桌子上重复练习,那么备份桌子的主键上是否存在潜在的重复?是的,是@PaulCampbell。我已经更新了我答案的这一部分。