主键的创建方式

1.
  1. create table stud(
  2. id int not null unique,
  3. name varchar(20)
  4. );
  5. mysql> desc stud;
  6. +-------+-------------+------+-----+---------+-------+
  7. | Field | Type | Null | Key | Default | Extra |
  8. +-------+-------------+------+-----+---------+-------+
  9. | id | int(11) | NO | PRI | NULL | |
  10. | name | varchar(20) | YES | | NULL | |
  11. +-------+-------------+------+-----+---------+-------+
  12. 2 rows in set (0.00 sec)
 
2.
  1. create table stud2(
  2. id int,
  3. name varchar(20),
  4. primary key(id)
  5. );
  6. mysql> desc stud2;
  7. +-------+-------------+------+-----+---------+-------+
  8. | Field | Type | Null | Key | Default | Extra |
  9. +-------+-------------+------+-----+---------+-------+
  10. | id | int(11) | NO | PRI | NULL | |
  11. | name | varchar(20) | YES | | NULL | |
  12. +-------+-------------+------+-----+---------+-------+
  13. 2 rows in set (0.00 sec)
3.
  1. create table stud3(
  2. id int not null unique,
  3. name varchar(20) not null unique
  4. );
  5. mysql> desc stud3;
  6. +-------+-------------+------+-----+---------+-------+
  7. | Field | Type | Null | Key | Default | Extra |
  8. +-------+-------------+------+-----+---------+-------+
  9. | id | int(11) | NO | PRI | NULL | |
  10. | name | varchar(20) | NO | UNI | NULL | |
  11. +-------+-------------+------+-----+---------+-------+
  12. 2 rows in set (0.00 sec)
4.
  1. create table stud4(
  2. name varchar(20) not null unique,
  3. id int not null unique
  4. );
  5. mysql> desc stud4;
  6. +-------+-------------+------+-----+---------+-------+
  7. | Field | Type | Null | Key | Default | Extra |
  8. +-------+-------------+------+-----+---------+-------+
  9. | name | varchar(20) | NO | PRI | NULL | |
  10. | id | int(11) | NO | UNI | NULL | |
  11. +-------+-------------+------+-----+---------+-------+
  12. 2 rows in set (0.00 sec)
总结:
1.每张表只能有一个主键
2.每张表不一定只有一个非空且唯一的字段
3.如果表中只有一个非空且唯一的字段,那他就是主键;如果表中不只有一个非空且唯一的字段那么第一个非空且唯一的字段就是主键
 

联合主键

  1. create table book2author (
  2. id int not null unique auto_increment,
  3. book_id int,
  4. author_id int,
  5. primary key (book_id,author_id)
  6. );
  7. mysql> desc book2author;
  8. +-----------+---------+------+-----+---------+----------------+
  9. | Field | Type | Null | Key | Default | Extra |
  10. +-----------+---------+------+-----+---------+----------------+
  11. | id | int(11) | NO | UNI | NULL | auto_increment |
  12. | book_id | int(11) | NO | PRI | NULL | |
  13. | author_id | int(11) | NO | PRI | NULL | |
  14. +-----------+---------+------+-----+---------+----------------+
  15. 3 rows in set (0.00 sec)

使用insert插入值,效果:

  1. mysql> select * from book2author;
    +----+---------+-----------+
    | id | book_id | author_id |
    +----+---------+-----------+
    |  1 |       1 |         1 |
    |  2 |       2 |         2 |
    |  3 |       3 |         3 |
    |  4 |       1 |         2 |
    |  5 |       1 |         3 |
    +----+---------+-----------+
    5 rows in set (0.00 sec)
  2.  
  3. 可以理解为:ID号为1的书由ID号为1,2,3的三个作者共同创作完成。

数据库存储引擎

什么是存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

mysql支持的存储引擎

MySQL常用的存储引擎
MyISAM存储引擎

由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。

InnoDB存储引擎(主要使用)
由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。

MEMORY
MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。

使用存储引擎

方法1:建表时指定

  1. MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
  2. MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
  3. MariaDB [db1]> show create table innodb_t1;
  4. MariaDB [db1]> show create table innodb_t2;

方法2:在配置文件中指定默认的存储引擎

  1. /etc/my.cnf
  2. [mysqld]
  3. default-storage-engine=INNODB
  4. innodb_file_per_table=1

查看

  1. [root@egon db1]# cd /var/lib/mysql/db1/
  2. [root@egon db1]# ls
  3. db.opt innodb_t1.frm innodb_t1.ibd innodb_t2.frm innodb_t2.ibd

练习

  1. 创建四个表,分别使用innodbmyisammemoryblackhole存储引擎,进行插入数据测试
  2.  
  3. MariaDB [db1]> create table t1(id int)engine=innodb;
  4. MariaDB [db1]> create table t2(id int)engine=myisam;
  5. MariaDB [db1]> create table t3(id int)engine=memory;
  6. MariaDB [db1]> create table t4(id int)engine=blackhole;
  7. MariaDB [db1]> quit
  8. [root@egon db1]# ls /var/lib/mysql/db1/ #发现后两种存储引擎只有表结构,无数据
  9. db.opt t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm
  10.  
  11. #memory,在重启mysql或者重启机器后,表内数据清空
  12. #blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

存储过程

存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

创建存储过程

  1. -- 创建存储过程
  2.  
  3. delimiter //
  4. create procedure p1()
  5. BEGIN
  6. select * from t1;
  7. END//
  8. delimiter ;
  9.  
  10. -- 执行存储过程
  11.  
  12. call p1()

对于存储过程,可以接收参数,其参数有三类:

  • in          仅用于传入参数用
  • out        仅用于返回值用
  • inout     既可以传入又可以当作返回值

有参数的存储过程:

  1. -- 创建存储过程
  2. delimiter \\
  3. create procedure p1(
  4. in i1 int,
  5. in i2 int,
  6. inout i3 int,
  7. out r1 int
  8. )
  9. BEGIN
  10. DECLARE temp1 int;
  11. DECLARE temp2 int default 0;
  12.  
  13. set temp1 = 1;
  14.  
  15. set r1 = i1 + i2 + temp1 + temp2;
  16.  
  17. set i3 = i3 + 100;
  18.  
  19. end\\
  20. delimiter ;
  21.  
  22. -- 执行存储过程
  23. set @t1 =4;
  24. set @t2 = 0;
  25. CALL p1 (1, 2 ,@t1, @t2);
  26. SELECT @t1,@t2;

结果集:

  1. delimiter //
  2. create procedure p1()
  3. begin
  4. select * from v1;
  5. end //
  6. delimiter ;

结果集+out:

  1. delimiter //
  2. create procedure p2(
  3. in n1 int,
  4. inout n3 int,
  5. out n2 int,
  6. )
  7. begin
  8. declare temp1 int ;
  9. declare temp2 int default 0;
  10.  
  11. select * from v1;
  12. set n2 = n1 + 100;
  13. set n3 = n3 + n1 + 100;
  14. end //
  15. delimiter ;

事务:

  1. delimiter \\
  2. create PROCEDURE p1(
  3. OUT p_return_code tinyint
  4. )
  5. BEGIN
  6. DECLARE exit handler for sqlexception
  7. BEGIN
  8. -- ERROR
  9. set p_return_code = 1;
  10. rollback;
  11. END;
  12.  
  13. DECLARE exit handler for sqlwarning
  14. BEGIN
  15. -- WARNING
  16. set p_return_code = 2;
  17. rollback;
  18. END;
  19.  
  20. START TRANSACTION;
  21. DELETE from tb1;
  22. insert into tb2(name)values('seven');
  23. COMMIT;
  24.  
  25. -- SUCCESS
  26. set p_return_code = 0;
  27.  
  28. END\\
  29. delimiter ;

游标:

  1. delimiter //
  2. create procedure p3()
  3. begin
  4. declare ssid int; -- 自定义变量1
  5. declare ssname varchar(50); -- 自定义变量2
  6. DECLARE done INT DEFAULT FALSE;
  7.  
  8. DECLARE my_cursor CURSOR FOR select sid,sname from student;
  9. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  10.  
  11. open my_cursor;
  12. xxoo: LOOP
  13. fetch my_cursor into ssid,ssname;
  14. if done then
  15. leave xxoo;
  16. END IF;
  17. insert into teacher(tname) values(ssname);
  18. end loop xxoo;
  19. close my_cursor;
  20. end //
  21. delimter ;

动态执行sql:

  1. delimiter \\
  2. CREATE PROCEDURE p4 (
  3. in nid int
  4. )
  5. BEGIN
  6. PREPARE prod FROM 'select * from student where sid > ?';
  7. EXECUTE prod USING @nid;
  8. DEALLOCATE prepare prod;
  9. END\\
  10. delimiter ;

删除存储过程

  1. drop procedure proc_name;

执行存储过程

  1. -- 无参数
  2. call proc_name()
  3.  
  4. -- 有参数,全in
  5. call proc_name(1,2)
  6.  
  7. -- 有参数,有inoutinout
  8. set @t1=0;
  9. set @t2=3;
  10. call proc_name(1,2,@t1,@t2)

索引

索引简介

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。
索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!

索引语法

创建索引

  1. --创建表时
  2. --语法:
  3. CREATE TABLE 表名 (
  4. 字段名1 数据类型 [完整性约束条件…],
  5. 字段名2 数据类型 [完整性约束条件…],
  6. [UNIQUE] INDEX | KEY
  7. [索引名] (字段名[(长度)] [ASC |DESC])
  8. );
  9.  
  10. --------------------------------
  11.  
  12. --创建普通索引示例:
  13.  
  14. CREATE TABLE emp1 (
  15. id INT,
  16. name VARCHAR(30) ,
  17. resume VARCHAR(50),
  18. INDEX index_emp_name (name)
  19. --KEY index_dept_name (dept_name)
  20. );
  21.  
  22. --创建唯一索引示例:
  23.  
  24. CREATE TABLE emp2 (
  25. id INT,
  26. name VARCHAR(30) ,
  27. bank_num CHAR(18) UNIQUE ,
  28. resume VARCHAR(50),
  29. UNIQUE INDEX index_emp_name (name)
  30. );
  31.  
  32. --创建全文索引示例:
  33.  
  34. CREATE TABLE emp3 (
  35. id INT,
  36. name VARCHAR(30) ,
  37. resume VARCHAR(50),
  38. FULLTEXT INDEX index_resume (resume)
  39. );
  40.  
  41. --创建多列索引示例:
  42.  
  43. CREATE TABLE emp4 (
  44. id INT,
  45. name VARCHAR(30) ,
  46. resume VARCHAR(50),
  47. INDEX index_name_resume (name,resume)
  48. );
  49.  
  50. ---------------------------------

添加和删除索引

  1. ---添加索引
  2.  
  3. ---CREATE在已存在的表上创建索引
  4. CREATE [UNIQUE] INDEX 索引名
  5. ON 表名 (字段名[(长度)] [ASC |DESC]) ;
  6.  
  7. ---ALTER TABLE在已存在的表上创建索引
  8.  
  9. ALTER TABLE 表名 ADD [UNIQUE] INDEX
  10. 索引名 (字段名[(长度)] [ASC |DESC]) ;
  11.  
  12. CREATE INDEX index_emp_name on emp1(name);
  13. ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num);
  14.  
  15. -- 删除索引
  16.  
  17. 语法:DROP INDEX 索引名 on 表名
  18.  
  19. DROP INDEX index_emp_name on emp1;
  20. DROP INDEX bank_num on emp2;

索引测试实验

  1. --创建表
  2. create table Indexdb.t1(id int,name varchar(20));
  3.  
  4. --存储过程
  5.  
  6. delimiter $$
  7. create procedure autoinsert()
  8. BEGIN
  9. declare i int default 1;
  10. while(i<500000)do
  11. insert into Indexdb.t1 values(i,'yuan');
  12. set i=i+1;
  13. end while;
  14. END$$
  15.  
  16. delimiter ;
  17.  
  18. --调用函数
  19. call autoinsert();
  20.  
  21. -- 花费时间比较:
  22. -- 创建索引前
  23. select * from Indexdb.t1 where id=300000;--0.32s
  24. -- 添加索引
  25. create index index_id on Indexdb.t1(id);
  26. -- 创建索引后
  27. select * from Indexdb.t1 where id=300000;--0.00s

pymsql

pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

一、下载安装:

  1. pip3 install pymysql

二、使用

1、执行SQL

  1. import pymysql
  2.  
  3. # 创建连接
  4. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  5. # 创建游标
  6. cursor = conn.cursor()
  7.  
  8. # 执行SQL,并返回收影响行数
  9. effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  10.  
  11. # 执行SQL,并返回受影响行数
  12. #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  13.  
  14. # 执行SQL,并返回受影响行数
  15. #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  16.  
  17. # 提交,不然无法保存新建或者修改的数据
  18. conn.commit()
  19.  
  20. # 关闭游标
  21. cursor.close()
  22. # 关闭连接
  23. conn.close()

2、获取新创建数据自增ID

  1. import pymysql
  2.  
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  4. cursor = conn.cursor()
  5. cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  6. conn.commit()
  7. cursor.close()
  8. conn.close()
  9.  
  10. # 获取最新自增ID
  11. new_id = cursor.lastrowid

3、获取查询数据

  1. import pymysql
  2.  
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  4. cursor = conn.cursor()
  5. cursor.execute("select * from hosts")
  6.  
  7. # 获取第一行数据
  8. row_1 = cursor.fetchone()
  9.  
  10. # 获取前n行数据
  11. # row_2 = cursor.fetchmany(3)
  12. # 获取所有数据
  13. # row_3 = cursor.fetchall()
  14.  
  15. conn.commit()
  16. cursor.close()
  17. conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')  # 相对当前位置移动
  • cursor.scroll(2,mode='absolute') # 相对绝对位置移动

4、fetch数据类型

  关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:

  1. import pymysql
  2.  
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='t1')
  4.  
  5. # 游标设置为字典类型
  6. cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  7. r = cursor.execute("call p1()")
  8.  
  9. result = cursor.fetchone()
  10.  
  11. conn.commit()
  12. cursor.close()
  13. conn.close()

Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)的更多相关文章

  1. MySQL主键设计

    [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...

  2. mysql主键问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_22314145/article/details/80824660 MySQL主键 一. MyS ...

  3. MySQL主键设计盘点

    目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 @ 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...

  4. MYSQL主键自动增加的配置及auto_increment注意事项

    文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二:   点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...

  5. 获得自动增长的MySQL主键

    下面的脚本教您如何获得自动增长的MySQL主键,如果您对MySQL主键方面感兴趣的话,不妨一看,相信对您学习MySQL主键方面会有所启迪. import java.sql.Connection; im ...

  6. Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别

    原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...

  7. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  8. mysql主键约束和唯一性约束

    主键约束和唯一性约束都是索引,它们的区别是: 主键字段可以确保唯一性,但主键字段不能为NULL. 唯一性约束可以确保唯一性,但唯一性约束的字段可以为NULL 唯一性约束对含有NULL的记录不起作用,即 ...

  9. 【转载】mysql主键的缺少导致备库hang

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

随机推荐

  1. 安装windows10和fedora23双系统的一些注意事项

    在安装双系统windows10和fedora的过程中遇到了很多的问题,博主也是在慢慢的摸索中最后莫名其妙的成功的安装双系统. 当然,幸亏博主机智的记住了中间的一些细节,所以大致上的有一些注意事项希望能 ...

  2. window环境下pipd的安装

    参照:https://blog.csdn.net/jin80506/article/details/83111848 如果你还是无法使用尝试查看是否自己已经将:C:\software\Python\P ...

  3. (转)超详细java中的ClassLoader详解

    转:https://blog.csdn.net/briblue/article/details/54973413 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于 ...

  4. 51单片机的idata,xdata,pdata,data的详解

    data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. bit :是指0x20-0x2f的可位寻址区idata:固定指前面0x00-0xff的2 ...

  5. 老牌激活工具– Microsoft Toolkit 2.4.3 + 详细图文教程【转】

    老牌激活工具-- Microsoft Toolkit 2.4.3 + 详细图文教程 windowsToolkit是一个一键激活MS Office 2010的工具.原理就是利用KMS来激活,不是新的激活 ...

  6. (64)C# 预处理器指令

    预处理器命令从来不会被翻译为可执行代码中的命令,但会影响编译过程的各个方面.例如:使用预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,即可以 ...

  7. python的列表 元组 字典

    列表和元组都是序列,是数据元素的集合,数据元素可以是数值.字符串,布尔值.对象等. 一.列表:用方括号定义[] 空列表 names = [] 带值的列表 names = ["bill&quo ...

  8. 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三

    目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 F ...

  9. Python 进阶_OOP 面向对象编程_静态方法和类方法

    目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...

  10. java构造器内部多态方法

    public class TestC { public static void main(String []args) { new Graph(5); }}class Grp{ void draw() ...