1.主键:

一个表只能有一个主键,主键可以由多列组成。

表中可以有对应的多个外键 

1 CREATE TABLE t5 (
 2                       nid int(11) NOT NULL AUTO_INCREMENT,
 3                       pid int(11) not NULL,
 4                       num int(11),
 5                       primary key(nid,pid)
 6                     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 7 
 8 
 9 
10                     create table t6(
11                         id int auto_increment primary key,
12                         name char(10),
13                         id1 int,
14                         id2 int,
15                         CONSTRAINT fk_t5_t6 foreign key (id1,id2) REFERENCES t1(nid,pid)
16                     )engine=innodb default charset=utf8;

mysql多个主键优缺点 mysql能有几个主键_mysql多个主键优缺点

mysql多个主键优缺点 mysql能有几个主键_自增_02

1 先创建tb2部门表
 2 
 3                 create table tb2(
 4                     id int not null auto_increment primary key,
 5                     department varchar(30)    
 6                 )engine=inbodb default charset=utf8;
 7                     
 8                 create table tb1用户表(
 9                     id int not null auto_increment primary key,
10                     name char(10),
11                     department_id int,
12                     p_id int,
13                     constraint fk_1 foreign key (department_id,p_id) references tb2(tid,xid)
14                 )engine=innodb default charset=utf8;

View Code

 2.对于自增的补充:

mysql多个主键优缺点 mysql能有几个主键_mysql多个主键优缺点

mysql多个主键优缺点 mysql能有几个主键_自增_02

1 查看表字段属性:                desc t10;
 2         
 3 查看表创建信息        show create table t10;
 4         
 5 竖行查看:        show create table t10 \G;
 6         
 7 设置自增字段的初始值:alter table t10 AUTO_INCREMENT=20;    
 8     
 9         MySQL: 自增步长
10             基于会话级别:
11                 show session variables like 'auto_inc%';    查看会话全局变量
12                 set session auto_increment_increment=2;     设置会话步长
13                 # set session auto_increment_offset=10;
14             基于全局级别:
15                 show global variables like 'auto_inc%';        查看全局变量
16                 set global auto_increment_increment=2;         设置会话步长
17                 # set global auto_increment_offset=10;
18                 
19                 
20         SqlServer:自增步长:
21             基础表级别:
22                 CREATE TABLE `t5` (
23                   `nid` int(11) NOT NULL AUTO_INCREMENT,
24                   `pid` int(11) NOT NULL,
25                   `num` int(11) DEFAULT NULL,
26                   PRIMARY KEY (`nid`,`pid`)
27                 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=2 DEFAULT CHARSET=utf8
28                 
29                 CREATE TABLE `t6` (
30                   `nid` int(11) NOT NULL AUTO_INCREMENT,
31                   `pid` int(11) NOT NULL,
32                   `num` int(11) DEFAULT NULL,
33                   PRIMARY KEY (`nid`,`pid`)
34                 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=20 DEFAULT CHARSET=utf8
35

View Code

 

3.类似主键外键的唯一索引:

唯一:
约束不能重复(可以为空)
PS: 主键不能重复(不能为空)
加速查找

1 create table t1(
2             id int ....,
3             num int,
4             xx int,
5             unique 唯一索引名称 (列名,列名),
6             constraint ....
7         )

 

4.外键的变种:

mysql多个主键优缺点 mysql能有几个主键_mysql多个主键优缺点

mysql多个主键优缺点 mysql能有几个主键_自增_02

1 ===》多对多
 2     
 3                 create table userinfo2(
 4                     id int auto_increment primary key,
 5                     name char(10),
 6                     gender char(10),
 7                     email varchar(64)
 8                 )engine=innodb default charset=utf8;
 9 
10                 create table host(
11                     id int auto_increment primary key,
12                     hostname char(64)
13                 )engine=innodb default charset=utf8;
14 
15 
16 主机归属表:                create table user2host(
17                     id int auto_increment primary key,
18                     userid int not null,
19                     hostid int not null,
20                     unique uq_user_host (userid,hostid),
21                     CONSTRAINT fk_u2h_user FOREIGN key (userid) REFERENCES userinfo2(id),
22                     CONSTRAINT fk_u2h_host FOREIGN key (hostid) REFERENCES host(id)
23                 )engine=innodb default charset=utf8;
24 
25 
26 一个用户可以有多个主机使用权,但为避免重复,所以对用户与主机的2个关系做了联合唯一索引,规范表的信息。

View Code

 

5.SQL语句数据操作补充。

mysql多个主键优缺点 mysql能有几个主键_mysql多个主键优缺点

mysql多个主键优缺点 mysql能有几个主键_自增_02

1 create table tb12(
  2                 id int auto_increment primary key,
  3                 name varchar(32),
  4                 age int
  5             )engine=innodb default charset=utf8;
  6     
  7         增
  8             insert into tb11(name,age) values('alex',12);
  9             
 10 多个插入:            insert into tb11(name,age) values('alex',12),('root',18);
 11             
 12 从tb11表得到数据插入到tb12:            insert into tb12(name,age) select name,age from tb11;
 13         删
 14             delete from tb12;
 15             delete from tb12 where id !=2 
 16             delete from tb12 where id =2 
 17             delete from tb12 where id > 2 
 18             delete from tb12 where id >=2 
 19             delete from tb12 where id >=2 or name='alex'
 20         
 21         改
 22             update tb12 set name='alex' where id>12 and name='xx'
 23             update tb12 set name='alex',age=19 where id>12 and name='xx'
 24         查
 25             
 26             select * from tb12;
 27             
 28             select id,name from tb12;
 29             
 30             select id,name from tb12 where id > 10 or name ='xxx';
 31             
 32             select id,name as cname from tb12 where id > 10 or name ='xxx';
 33             
 34             select name,age,11 from tb12;
 35             
 36             其他:
 37                 select * from tb12 where id != 1
 38                 select * from tb12 where id in (1,5,12);
 39                 select * from tb12 where id not in (1,5,12);
 40                 select * from tb12 where id in (select id from tb11)
 41 查看5-12id的数据,包括5,12:                select * from tb12 where id between 5 and 12;
 42     
 43             
 44                 通配符:
 45                 
 46 %表示多个:                select * from tb12 where name like "a%"
 47 _表示一个:                select * from tb12 where name like "a_"
 48     
 49             
 50                 分页:
 51                 
 52 初始值开始前10个:                    select * from tb12 limit 10;
 53                     
 54                     select * from tb12 limit 0,10;
 55 从10开始往后的10个:                    select * from tb12 limit 10,10;
 56                     select * from tb12 limit 20,10;
 57                     
 58 取20之前的10个数据:                    select * from tb12 limit 10 offset 20;
 59         
 60         
 61                     # page = input('请输入要查看的页码')
 62                     # page = int(page)
 63                     # (page-1) * 10
 64                     # select * from tb12 limit 0,10; 1 
 65                     # select * from tb12 limit 10,10;2
 66                 
 67                 
 68                 排序:
 69                     select * from tb12 order by id desc; 大到小
 70                     select * from tb12 order by id asc;  小到大
 71 
 72 
 73 
 74 age从大到小排,如果数据的age相等,按他们的id从大到小排:                     select * from tb12 order by age desc,id desc;
 75                      
 76                     取后10条数据
 77                     select * from tb12 order by id desc limit 10;
 78             
 79                 分组:
 80                 
 81                     select count(id),max(id),part_id from userinfo5 group by part_id;
 82                     
 83 计数                    count
 84                     max
 85                     min
 86                     sum
 87 平均值                    avg
 88                     
 89                     **** 如果对于聚合函数结果进行二次筛选时?必须使用having ****
 90 取part_id列超过2个计数的part_id值:                    select count(id),part_id from userinfo5 group by part_id having count(id) > 1;
 91                     
 92                     select count(id),part_id from userinfo5 where id > 0 group by part_id having count(id) > 1;
 93             
 94                     
 95                 连表操作:
 96                 
 97                     select * from userinfo5,department5
 98                     
 99                     select * from userinfo5,department5 where userinfo5.part_id = department5.id
100                     
101 
102                     select * from userinfo5 left join department5 on userinfo5.part_id = department5.id
103                     select * from department5 left join userinfo5 on userinfo5.part_id = department5.id
104                     # userinfo5左边全部显示
105                     
106                     
107                     # select * from userinfo5 right join department5 on userinfo5.part_id = department5.id
108                     # department5右边全部显示
109                 
110                 
111                 
112                     select * from userinfo5 innder join department5 on userinfo5.part_id = department5.id
113                     将出现null时一行隐藏
114                     
115                     
116                 
117                 
118                 
119                 
120                     select * from 
121                         department5 
122                     left join userinfo5 on userinfo5.part_id = department5.id
123                     left join userinfo6 on userinfo5.part_id = department5.id
124                 
125                 
126                     select 
127                         score.sid,
128                         student.sid 
129                         from 
130                     score
131 
132                         left join student on score.student_id = student.sid
133 
134                         left join course on score.course_id = course.cid
135 
136                         left join class on student.class_id = class.cid
137 
138                         left join teacher on course.teacher_id=teacher.tid
139                     
140             
141             
142             
143             select count(id) from userinfo5;

View Code

 

mysql 给表添加一个联合唯一索引: alter table user add nuique index(user_id,user_name);