MySQL数据库总结
Q:如何进行表结构复制
A:在指定数据库下,存在表source_table,现要创建与source_table结构相同的新表new_table,SQL如下:
mysql> CREATE TABLE new_table LIKE source_table; Query OK, 1 row affected (0.04 sec)
Q:如何进行数据导入
A:将source_table的所有数据导入new_table,SQL如下:
mysql> INSERT INTO new_table SELECT * FROM source_table; Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0
Q:如何完整复制表结构和数据
A:通过一条命令完成对现有表结构和数据的复制,SQL如下:
mysql> CREATE TABLE new_table SELECT * FROM source_table; Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0
Q:如何用现有数据填充自定义表
A: 当新表的结构发生变更后,需要从原表中导入数据时,可使用下列方法,SQL如下:
CREATE TABLE `new_table` ( `ID` INT NOT NULL PRIMARY KEY, `GMT_CREATE` DATETIME NOT NULL, `GMT_MODFIED` DATETIME NOT NULL, `INFO` VARCHAR(64) NOT NULL, `NAME` VARCHAR(32) NOT NULL )ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT s.column_2 as ID, r.column_1 as GMT_CREATE, s.column_3 as GMT_MODFIED, r.column_3 as INFO, s.column_4 as NAME FROM source_table_1 s, source_table_2 r WHERE s.column_1 = r.column_2 and s.column_5 = expr;
Q:如何复制现有数据库
A:对数据库中的所有表进行复制,需使用游标,SQL示例如下:
DELIMITER $$ use `database`$$ DROP PROCEDURE IF EXISTS `database`.`datamove`$$ CREATE DEFINER=`user`@`%` PROCEDURE `datamove`(IN source_database varchar(32)) BEGIN DECLARE v_table_name varchar(32); DECLARE v_done BIT DEFAULT FALSE; DECLARE c1 CURSOR FOR SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = source_database; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; OPEN c1; REPEAT FETCH c1 INTO v_table_name; IF NOT v_done THEN SET @sql = CONCAT('INSERT INTO ', v_table_name, ' SELECT * FROM ', source_database,'.',v_table_name); PREPARE stmt FROM @sql; EXECUTE stmt; END IF; UNTIL v_done END REPEAT; CLOSE c1; COMMIT; END$$ DELIMITER;
mysql> call datamove(‘test’);
Q: MySQL中char、varchar和text的区别
A: 引自:http://www.sensail.com/archives/85
他们的存储方式和数据的检索方式都不一样。
数据的检索效率是:char>varchar>text
空间占用方面,要具体情况具体分析了。
CHAR(M) | M个字节,0 <=M<= 255 |
VARCHAR(M) | L+1个字节,其中L<=M且0 <=M<= 65535 |
TEXT | L+2个字节,其中L< 216 |
Char为定长,varchar,text为变长
Char在保存的时候,后面(右边)会用空格填充到指定的长度,在检索的时候后面的空格会去掉,所以检索出来的数据需要再用什么trim之类的函数去处理。(与sql server可能有些不同)
Varchar在保存的时候,不进行填充。当值保存和检索时尾部的空格仍保留。
TEXT列不能有默认值,存储或检索过程中,不存在大小写转换.
当存储的字符超过他们定义的长度时候,如果不是在sql服务器的严格模式下,都会自动截取合适的字段存储,而不会出现错误。但是,如果是中文的话同样要报错误:)比如定义char(4),然后insert (‘c哈哈’).
注意一点的,Char,Varchar不像数值类型,有系统默认长度,所以必须在括号里定义长度,可以有默认值
text不可以写默认值,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入(严格模式下没有测试 :))
存储计算:
在使用UTF8字符集的时候,手册上是这样描叙的:
· 基本拉丁字母、数字和标点符号使用一个字节。
· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。
转载于:https://blog.51cto.com/tianya23/369309