1. 程式人生 > >表結構與資料複製

表結構與資料複製

【1】表結構複製

首先是表結構的複製:

第一種方式:

create table 表名 like [資料庫.]表名;

-- 如果是同一個資料庫下的表的複製,不需要新增[資料庫.];
-- 不會複製資料;

示例如下:

-- 原表建立語句:
CREATE TABLE `tb_lesson` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(60) DEFAULT NULL,
  `joinTime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34
DEFAULT CHARSET=utf8;
-- 刪除原表並從備份資料庫複製: drop table tb_lesson; create table tb_lesson like db_exam2.tb_lesson; -- 檢視複製的新表語句; CREATE TABLE `tb_lesson` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(60) DEFAULT NULL, `JoinTime` datetime DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT
CHARSET=utf8;
-- 欄位屬性未變

第二種方式:

create table new_table
as
select * from [資料庫名.]old_table;

-- 第二種方式在mysql下可能會丟失列屬性,如主鍵,自增等。

示例如下:

-- 第二種方式複製的新表如下:
CREATE TABLE `tb_lesson` (
  `ID` int(11) NOT NULL DEFAULT '0',
  `Name` varchar(60) DEFAULT NULL,
  `JoinTime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT
CHARSET=utf8;
-- 改變了欄位屬性等。 -- 同時複製了資料; -- 如果側重表結構不建議使用這種方式。

【2】表資料複製

語法格式如下:

  • 又被稱為蠕蟲複製
insert into Table2(field1,field2,...) select value1,value2,... from Table1;

// 如果不指定列,則如下(一定保證兩個表列一致):

insert into new_table select * from [資料庫.]old_table

需要注意的是,下面方式不適用於MySQL:

SELECT vale1, value2 into Table2 from Table1

該方式常常用於MySQL觸發器、儲存過程或函式中為變數賦值。

綜上,(兩個資料庫之間)表複製過程如下:

複製db_exam2資料庫的表tb_lesson到當前資料庫的表tb_lesson(表不出存在時需要建立);

-- 刪除已經存在的表;
drop table if EXISTS tb_lesson;
--複製並建立新表
create table tb_lesson like db_exam2.tb_lesson;
-- 複製資料
insert into tb_lesson select * from db_exam2.tb_lesson;

這裡是從另外一個數據庫(兩個資料庫在同一個主機)複製表和資料到當前資料庫,省略了當前資料庫名字。

也可以不省略資料庫名字如下:

從data_analysis複製表和資料到data_analysis_zh;

此處不管當前連線物件是哪個資料庫,都可以正確執行。

drop table if EXISTS data_analysis_zh.store_card_2;

create table data_analysis_zh.store_card_2 like data_analysis.pos_sale;

INSERT into data_analysis_zh.store_card_2 
select * from data_analysis.pos_sale where data_analysis.pos_sale.number_store_card >0;

select * from data_analysis_zh.store_card_2 ;

效果等同如下(開啟data_analysis連線):

drop table if EXISTS data_analysis_zh.store_card_2;

create table data_analysis_zh.store_card_2 like pos_sale;

INSERT into data_analysis_zh.store_card_2 
select * from pos_sale where number_store_card >0;

select * from data_analysis_zh.store_card_2 ;

效果等同如下(開啟data_analysis_zh連線):

drop table if EXISTS store_card_2;

create table store_card_2 like data_analysis.pos_sale;

INSERT into store_card_2 
select * from data_analysis.pos_sale where [data_analysis.pos_sale.]number_store_card >0;

select * from store_card_2 ;

【3】限制更新記錄總數

語法格式如下:

update table_name set [field] = [value] [where 條件] [limit Num];

e.g:

update p_user_2 set age = 19 LIMIT 6;

-- 將前六名同學age統一改為19

【4】限制刪除記錄總數

語法格式如下:

delete from table_name [where 條件] [limit Num];

e.g:

delete from p_user_2  LIMIT 6;

-- 將前六名同學刪除