這里以前面新建的 teacher 表為例, teacher 表的字段為 name、age、id_number,向教師表新增一條數(shù)據(jù)命令如下:
站在用戶的角度思考問題,與客戶深入溝通,找到廣德網(wǎng)站設(shè)計(jì)與廣德網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋廣德地區(qū)。
執(zhí)行下上面的這條命令,執(zhí)行結(jié)果如下圖:
其中 “INSERT INTO” 關(guān)鍵字表示這條命令是插入數(shù)據(jù)命令,“teacher” 是要插入數(shù)據(jù)的目標(biāo)數(shù)據(jù)表名稱,“name,age,id_number” 是表的字段名,“VALUES” 后面跟的是字段對(duì)應(yīng)的值,值的順序和前面字段的順序一致。
上面介紹了如何向數(shù)據(jù)表插入一條數(shù)據(jù),這里需要查看數(shù)據(jù)表已有的所有數(shù)據(jù):
執(zhí)行結(jié)果如下圖:
“SELECT” 關(guān)鍵字表示這條命令是查詢相關(guān)命令,"*" 則代表要查詢出表中所有的數(shù)據(jù)。“FROM teacher” 則表明要查詢的是哪一個(gè)數(shù)據(jù)表。
關(guān)于 SELECT 查詢語句還有很多中使用場(chǎng)景,比如我們要查詢出表中 age 字段的值大于 20 歲的數(shù)據(jù)。關(guān)于 SELECT 的其他使用我們會(huì)在后面的小節(jié)詳細(xì)講解。
新增多條數(shù)據(jù)命令:
執(zhí)行結(jié)果如下圖:
本小節(jié)介紹了如圖向數(shù)據(jù)表插入一條數(shù)據(jù)、查詢表所有數(shù)據(jù)、向表插入多條數(shù)據(jù)。前面介紹數(shù)據(jù)表的設(shè)計(jì)規(guī)范時(shí)介紹了數(shù)據(jù)表的第二設(shè)計(jì)范式要求所有數(shù)據(jù)表需要有業(yè)務(wù)主鍵。需要注意的是本節(jié)中 teacher 表的業(yè)務(wù)主鍵為自增 id,因此插入數(shù)據(jù)的時(shí)候不需要插入 id 字段的值。id 字段的默認(rèn)是從 1 開始自增的,也可以指定自增起始值,如下建表語句,id自增值是從100開始的:
其中 “AUTO_INCREMENT=100” 表示自增主鍵 id 的值默認(rèn)從 100 開始自增加的。
本節(jié)介紹數(shù)據(jù)的插入,復(fù)制數(shù)據(jù)到另一張表的Sql語法,主要語法有: insert into,insert into select,select into from 等用法,下面將一一為大家詳細(xì)說明:
以下面兩張表進(jìn)行sql腳本說明
insert into有兩種語法,分別如下:
語法1:INSERT INTO?table_name?VALUES (value1,value2,value3,...);? ?--這種形式無需指定要插入數(shù)據(jù)的列名,只需提供被插入的值即可:
語法2:INSERT INTO?table_name?(column1,column2,column3,...) VALUES (value1,value2,value3,...);? ? --這種形式需指定要插入數(shù)據(jù)的列名,插入的值需要和列名一一對(duì)應(yīng):
eg:insert into customer values('1006','14006','王欣欣','27','深圳市');? --向表customer插入一條數(shù)據(jù)
eg:insert into customer values('1007','14007','孟一凡','27','');? ? ? ? ? ? ?--向表customer插入一條數(shù)據(jù),最后一個(gè)值不填表示對(duì)應(yīng)的值為空,非必填項(xiàng)可以不用插入值
eg:insert into customer (cus_id,cus_no,cus_name,cus_age,cus_adds) values('1008','14008','孔凡','26','廣州市');? ? ? --向表customer插入一條數(shù)據(jù),插入的值與列名一一對(duì)應(yīng)
詳解:insert into select? ? --表示從一個(gè)表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到一個(gè)已存在的表中。目標(biāo)表中任何已存在的行都不會(huì)受影響。
語法1:INSERT INTO?table_name2?SELECT? * FROM?table_name1;? --表示將表table_name1中復(fù)制所有列的數(shù)據(jù)插入到已存在的表table_name2中。被插入數(shù)據(jù)的表為table_name2,切記不要記混了。
eg:insert into customer select * from asett ? --將表asett中所有列的數(shù)據(jù)插入到表customer中
語法2:INSERT INTO?table_name2?(column_name(s))?SELECT?column_name(s)?FROM? table_name1;? --指定需要復(fù)制的列,只復(fù)制制定的列插入到另一個(gè)已存在的表table_name2中:
eg:insert into customer (cus_id,cus_no) select ast_id,ast_no from asett ? --將表asett中列ast_id和ast_no的數(shù)據(jù)插入到表customer對(duì)應(yīng)的cus_id,cus_no列中
詳解:從一個(gè)表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到另一個(gè)新表中。
語法1:SELECT * INTO?newtable?[IN?externaldb] FROM?table1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--復(fù)制所有的列插入到新表中:
eg:select * into?customer from?asett? ?? --將asett表中數(shù)據(jù)插入到customer中,被插入的 表customer不存在
eg:select * into?customer from?asett where ast_id = '1008'? ? --只復(fù)制表asett中ast_id=1008的數(shù)據(jù)插入到customer中,被插入的 表customer不存在
語法2:SELECT?column_name(s)?INTO?newtable?[IN?externaldb] FROM?table1;? ?--只復(fù)制指定的列插入到新表中:
eg:select ast_id,ast_no into?customer?from?asett? --將asett表中列ast_id,ast_no數(shù)據(jù)插入到customer中,被插入的 表customer不存在
區(qū)別1:insert into customer select * from asett where ast_id='1009' --插入一行,要求表customer?必須存在
區(qū)別2:select * into customer? from asett? where ast_id='1009' --也是插入一行,要求表customer? 不存在
區(qū)別3:select into from?:將查詢出來的數(shù)據(jù)復(fù)制到一張新表中保存,表結(jié)構(gòu)與查詢結(jié)構(gòu)一致。
區(qū)別4:insert into select?:為已經(jīng)存在的表批量添加新數(shù)據(jù)。
MySQL如何快速插入大量數(shù)據(jù)
這幾天嘗試了使用不同的存儲(chǔ)引擎大量插入MySQL表數(shù)據(jù),主要試驗(yàn)了MyISAM存儲(chǔ)引擎和InnoDB。
下面是實(shí)驗(yàn)過程:
一、InnoDB存儲(chǔ)引擎。
創(chuàng)建數(shù)據(jù)庫(kù)和表
Sql代碼
CREATE DATABASE ecommerce;
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
birth TIMESTAMP,
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
partition BY RANGE (store_id) (
partition p0 VALUES LESS THAN (10000),
partition p1 VALUES LESS THAN (50000),
partition p2 VALUES LESS THAN (100000),
partition p3 VALUES LESS THAN (150000),
Partition p4 VALUES LESS THAN MAXVALUE
);
創(chuàng)建存儲(chǔ)過程
Sql代碼
use ecommerce;
CREATE PROCEDURE BatchInsert(IN init INT, IN loop_time INT)
BEGIN
DECLARE Var INT;
DECLARE ID INT;
SET Var = 0;
SET ID = init;
WHILE Var loop_time DO
insert into employees(id,fname,lname,birth,hired,separated,job_code,store_id) values(ID,CONCAT('chen',ID),CONCAT('haixiang',ID),Now(),Now(),Now(),1,ID);
SET ID = ID + 1;
SET Var = Var + 1;
END WHILE;
END;
調(diào)用存儲(chǔ)過程插入數(shù)據(jù)
Sql代碼
CALL BatchInsert(30036,200000)
用時(shí):3h 37min 8sec
二、MyISAM存儲(chǔ)引擎
創(chuàng)建表
Sql代碼
use ecommerce;
CREATE TABLE ecommerce.customer (
id INT NOT NULL,
email VARCHAR(64) NOT NULL,
name VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL,
phone VARCHAR(13),
birth DATE,
sex INT(1),
avatar BLOB,
address VARCHAR(64),
regtime DATETIME,
lastip VARCHAR(15),
modifytime TIMESTAMP NOT NULL,
PRIMARY KEY (id)
)ENGINE = MyISAM ROW_FORMAT = DEFAULT
partition BY RANGE (id) (
partition p0 VALUES LESS THAN (100000),
partition p1 VALUES LESS THAN (500000),
partition p2 VALUES LESS THAN (1000000),
partition p3 VALUES LESS THAN (1500000),
partition p4 VALUES LESS THAN (2000000),
Partition p5 VALUES LESS THAN MAXVALUE
);
創(chuàng)建存儲(chǔ)過程
Sql代碼
use ecommerce;
DROP PROCEDURE IF EXISTS ecommerce.BatchInsertCustomer;
CREATE PROCEDURE BatchInsertCustomer(IN start INT,IN loop_time INT)
BEGIN
DECLARE Var INT;
DECLARE ID INT;
SET Var = 0;
SET ID= start;
WHILE Var loop_time
DO
insert into customer(ID,email,name,password,phone,birth,sex,avatar,address,regtime,lastip,modifytime)
values(ID,CONCAT(ID,'@sina.com'),CONCAT('name_',rand(ID)*10000 mod 200),123456,13800000000,adddate('1995-01-01',(rand(ID)*36520) mod 3652),Var%2,';fm=52gp=0.jpg','北京市海淀區(qū)',adddate('1995-01-01',(rand(ID)*36520) mod 3652),'8.8.8.8',adddate('1995-01-01',(rand(ID)
*36520) mod 3652));
SET Var = Var + 1;
SET ID= ID + 1;
END WHILE;
END;
調(diào)用存儲(chǔ)過程插入數(shù)據(jù)
Sql代碼
ALTER TABLE customer DISABLE KEYS;
CALL BatchInsertCustomer(1,2000000);
ALTER TABLE customer ENABLE KEYS;
用時(shí):8min 50sec
通過以上對(duì)比發(fā)現(xiàn)對(duì)于插入大量數(shù)據(jù)時(shí)可以使用MyISAM存儲(chǔ)引擎,如果再需要修改MySQL存儲(chǔ)
引擎可以使用命令:
Sql代碼
ALTER TABLE t ENGINE = MYISAM;