当前位置:Gxlcms > 数据库问题 > MySQL数据库学习【第五篇】完整性约束

MySQL数据库学习【第五篇】完整性约束

时间:2021-07-01 10:21:17 帮助过:20人阅读

 1 ============单列做主键===============
 2 #方法一:not null+unique
 3 create table department1(
 4 id int not null unique, #主键
 5 name varchar(20) not null unique,
 6 comment varchar(100)
 7 );
 8 
 9 mysql> desc department1;
10 +---------+--------------+------+-----+---------+-------+
11 | Field   | Type         | Null | Key | Default | Extra |
12 +---------+--------------+------+-----+---------+-------+
13 | id      | int(11)      | NO   | PRI | NULL    |       |
14 | name    | varchar(20)  | NO   | UNI | NULL    |       |
15 | comment | varchar(100) | YES  |     | NULL    |       |
16 +---------+--------------+------+-----+---------+-------+
17 rows in set (0.01 sec)
18 
19 #方法二:在某一个字段后用primary key
20 create table department2(
21 id int primary key, #主键
22 name varchar(20),
23 comment varchar(100)
24 );
25 
26 mysql> desc department2;
27 +---------+--------------+------+-----+---------+-------+
28 | Field   | Type         | Null | Key | Default | Extra |
29 +---------+--------------+------+-----+---------+-------+
30 | id      | int(11)      | NO   | PRI | NULL    |       |
31 | name    | varchar(20)  | YES  |     | NULL    |       |
32 | comment | varchar(100) | YES  |     | NULL    |       |
33 +---------+--------------+------+-----+---------+-------+
34 rows in set (0.00 sec)
35 
36 #方法三:在所有字段后单独定义primary key
37 create table department3(
38 id int,
39 name varchar(20),
40 comment varchar(100),
41 constraint pk_name primary key(id); #创建主键并为其命名pk_name
42 
43 mysql> desc department3;
44 +---------+--------------+------+-----+---------+-------+
45 | Field   | Type         | Null | Key | Default | Extra |
46 +---------+--------------+------+-----+---------+-------+
47 | id      | int(11)      | NO   | PRI | NULL    |       |
48 | name    | varchar(20)  | YES  |     | NULL    |       |
49 | comment | varchar(100) | YES  |     | NULL    |       |
50 +---------+--------------+------+-----+---------+-------+
51 rows in set (0.01 sec)
52 
53 单列主键
技术分享图片

==================多列做主键================
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);


mysql> desc service;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip | varchar(15) | NO | PRI | NULL | |
| port | char(5) | NO | PRI | NULL | |
| service_name | varchar(10) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
rows in set (0.00 sec)

mysql> insert into service values
-> (‘172.16.45.10‘,‘3306‘,‘mysqld‘),
-> (‘172.16.45.11‘,‘3306‘,‘mariadb‘)
-> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘);
ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘

多列主键


技术分享图片
 1 ==================多列做主键================
 2 create table service(
 3 ip varchar(15),
 4 port char(5),
 5 service_name varchar(10) not null,
 6 primary key(ip,port)
 7 );
 8 
 9 
10 mysql> desc service;
11 +--------------+-------------+------+-----+---------+-------+
12 | Field        | Type        | Null | Key | Default | Extra |
13 +--------------+-------------+------+-----+---------+-------+
14 | ip           | varchar(15) | NO   | PRI | NULL    |       |
15 | port         | char(5)     | NO   | PRI | NULL    |       |
16 | service_name | varchar(10) | NO   |     | NULL    |       |
17 +--------------+-------------+------+-----+---------+-------+
18 rows in set (0.00 sec)
19 
20 mysql> insert into service values
21     -> (‘172.16.45.10‘,‘3306‘,‘mysqld‘),
22     -> (‘172.16.45.11‘,‘3306‘,‘mariadb‘)
23     -> ;
24 Query OK, 2 rows affected (0.00 sec)
25 Records: 2  Duplicates: 0  Warnings: 0
26 
27 mysql> insert into service values (‘172.16.45.10‘,‘3306‘,‘nginx‘);
28 ERROR 1062 (23000): Duplicate entry ‘172.16.45.10-3306‘ for key ‘PRIMARY‘
技术分享图片

五、auto_increment (自增约束)

步长increment与起始偏移量offset:auto_increment_increment,auto_increment_offset

 

3.--------偏移量:auto_increment_offset---------
==============没有设置偏移量的时候
create table dep(
id int primary key auto_increment,
name char(10)
);
insert into dep(name) values(‘IT‘),(‘HR‘),(‘EFO‘);
select * from dep;

================设置自增的时候以10开头
create table dep1(
id int primary key auto_increment,
name char(10)
)auto_increment = 10;
insert into dep1(name) values(‘IT‘),(‘HR‘),(‘EFO‘);
select * from dep1;

===============auto_increment_increment:自增步长
create table dep3(
id int primary key auto_increment,
 name char(10)
);
会话:通过客户端连到服务端(一次链接称为一次会话)
set session auto_increment_increment = 2; #会话级,只对当前会话有效
set global auto_increment_increment=2; #全局,对所有的会话都有效
insert into dep3(name) values(‘IT‘),(‘HR‘),(‘SALE‘),(‘Boss‘);

-----------查看变量----------
show variables like ‘%auto_in%‘;#查看变量。只要包含auto_in就都查出来了

=========auto_increment_offset:偏移量+auto_increment_increment:步长===========
注意:如果auto_increment_offset的值大于auto_increment_increment的值,
则auto_increment_offset的值会被忽略

set session auto_increment_offset=2;
set session auto_increment_increment=3;
show variables like ‘%auto_in%‘;

create table dep4(
id int primary key auto_increment,
name char(10)
);
insert into dep4(name) values(‘IT‘),(‘HR‘),(‘SALE‘),(‘Boss‘);

 六、foreign key (外键约束)

员工信息表有三个字段:工号  姓名  部门

公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费

解决方法:

我们完全可以定义一个部门表

然后让员工信息表关联该表,如何关联,即foreign key

如下图简单的表示了一下员工表与部门表的关系,即员工表的(dep_id)要关联部门表的id字段

技术分享图片

多对一(一个表多条记录的某一字段关联另一张表的唯一一个字段):员工有部门,部门又有好多信息,所以
分开建了一张部门表,部门表的id 和员工表里面
的dep_id相关联。(dep_id要关联部门表的id字段
(注意:1.先建被关联的表,
        2.被关联的字段必须唯一
        3.先给被关联的表插入记录
 )


先建张部门表(被关联表)
create table dep(
id int not null unique,
#id int primary key auto_increment,
name varchar(50),
comment varchar(100)
);

再建张员工表(关联表)
create table emp_info(
id int primary key auto_increment,
name varchar(20),
dep_id int,
constraint FK_depid_id foreign key(dep_id) references dep(id) #references :关联
on delete cascade  #关联的表删了,被关联的表也删了
on update cascade  #关联的表修改了,被关联的表也修改了
);
#先给被关联的表初始化记录
insert into dep values
(1,‘欧德博爱技术有限事业部‘,‘说的好...‘),
(2,‘艾利克斯人力资源部‘,‘招不到人‘),
(3,‘销售部‘,‘卖不出东西‘);


insert into emp_info values
(1,‘egon‘,1),
(2,‘alex1‘,2),
(3,‘alex2‘,2),
(4,‘alex3‘,2),
(5,‘李坦克‘,3),
(6,‘刘飞机‘,3),
(7,‘张火箭‘,3),
(8,‘林子弹‘,3),
(9,‘加特林‘,3);

#修改
update dep set id =301 where id = 2;
select * from dep;
delect * from em_info;


如果部门解散了,员工也就走吧,就是部门表没了,
员工表也就没有了。

 

 运行结果如下图:

技术分享图片

 查看创建的表

技术分享图片

 修改id=301

技术分享图片

查看被关联表和关联表

技术分享图片

 

 

   

MySQL数据库学习【第五篇】完整性约束

标签:ons   就是   pos   ble   efault   records   多列   填充   人力   

人气教程排行