VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 数据库(字段的约束条件,表之间的关系)

10.6 约束条件

10.61 not null 、default

复制代码
create table t15(
    id int,
    name char(16) not null,
    sex enum('male','female','other') not null default "male"
);
#alter table t15 modify name char(16) not null;
insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');
​
mysql> desc t15;
+-------+-------------------------------+------+-----+---------+-------+
| Field | Type                          | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+-------+
| id    | int(11)                       | YES  |     | NULL    |       |
| name  | char(16)                      | NO   |     | NULL    |       |
| sex   | enum('male','female','other') | NO   |     | male    |       |
+-------+-------------------------------+------+-----+---------+-------+
​
mysql> select * from t15;
+------+-------+------+
| id   | name  | sex  |
+------+-------+------+
|    1 | egon1 | male |
|    2 | egon2 | male |
|    3 | egon3 | male |
+------+-------+------+
复制代码

10.62 unique

mysql中存在一种专门的数据结构,叫 key,又称为索引,通过该数据结构可以减少 i/o 次数,从而加速查询效率index key : 只有加速查询的效果,没有约束的功能 unique key:不仅有加速查询的效果,还附加了一种约束的功能 primary key:不仅有加速查询的效果,还附加了一种约束的功能,并且innodb存储引擎会按照主键字段的值 来组织表中所有的数据,所以一种inndob表中必须有、而且只能有一个主键,通常为该表的id字段

unique:限制字段的值的唯一性,单从约束角度去看:唯一性约束

复制代码
#单列唯一
create table t16(
    id int unique,
    name char(16)
);
​
# 联合唯一(不能完全相同)
create table server(
    id int unique,
    ip char(15),
    port int,
    unique(ip,port)
);
mysql> desc server;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  | UNI | NULL    |       |
| ip    | char(15) | YES  | MUL | NULL    |       |
| port  | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into server values(1,'1.1.1.1',3306),(2,'1.1.1.1',3307),(3,'1.1.1.2',3306);
mysql> select * from server;
+------+---------+------+
| id   | ip      | port |
+------+---------+------+
|    1 | 1.1.1.1 | 3306 |
|    2 | 1.1.1.1 | 3307 |
|    3 | 1.1.1.2 | 3306 |
+------+---------+------+
复制代码

10.63 primary key

primary key:单单从约束角度去看,primary key就等同于 not null + unique 强调: 1、一张表中必须有,并且只能有一个主键 2、一张表中都应该有一个id字段,而且应该把id字段做成主键

复制代码
create table t17(
    id int primary key,
    name char(16),
    age int,
    sex char(6)
)engine=innodb;
​
​
#联合主键(不完全相同,但不能为空)
create table t19(
    ip char(15),
    port int,
    primary key(ip,port)
);
mysql> desc t19;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip    | char(15) | NO   | PRI |         |       |
| port  | int(11)  | NO   | PRI | 0       |       |
+-------+----------+------+-----+---------+-------+
复制代码

10.64 auto_increment

只能给被约束成key的字段加自增属性,默认起始位置是1,步长也为1

复制代码
# primary key auto_increment
create table t20(
    id int primary key auto_increment,
    name char(16)
)engine=innodb;
​
mysql> insert t20(name) values('egon1');
mysql> insert t20(name) values('egon2');
mysql> select * from t20;
+----+-------+
| id | name  |
+----+-------+
|  1 | egon1 |
|  2 | egon2 |
+----+-------+
复制代码

10.7 表关系

10.71 多对一(foreign key)

1、把所有数据都存放于一张表的弊端:

  • 表的组织结构复杂不清晰

  • 浪费空间

  • 扩展性极差

    2、寻找表与表之间的关系的方法: 举例:emp表 dep表 步骤一: part1: 1、先站在左表emp的角度 2、去找左表emp的多条记录能否对应右表dep的一条记录

    part2: ​ 1、站在右表dep的角度 2、去找右表dep的多条记录能否对应左表emp的一条记录 3、如何实现?在emp表中新增一个dep_id字段,该字段指向dep表的id字段

    4、foreign key会带来什么样的效果?

约束1:在创建表时,先建被关联的表dep,才能建关联表emp

复制代码
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);
mysql> desc dep;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| dep_name    | char(10) | YES  |     | NULL    |                |
| dep_comment | char(60) | YES  |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
);
mysql> desc emp;
+--------+-----------------------+------+-----+---------+----------------+
| Field  | Type                  | Null | Key | Default | Extra          |
+--------+-----------------------+------+-----+---------+----------------+
| id     | int(11)               | NO   | PRI | NULL    | auto_increment |
| name   | char(16)              | YES  |     | NULL    |                |
| gender | enum('male','female') | NO   |     | male    |                |
| dep_id | int(11)               | YES  | MUL | NULL    |                |
+--------+-----------------------+------+-----+---------+----------------+
复制代码

约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp

复制代码
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','形象大使'),
('nb技术部','nb技术能力有限部门');
mysql> select * from dep;
+----+-------------+-------------------------------------------+
| id | dep_name    | dep_comment                               |
+----+-------------+-------------------------------------------+
|  1 | sb教学部    | sb辅导学生学习,教授python课程            |
|  2 | 外交部      | 形象大使                                  |
|  3 | nb技术部    | nb技术能力有限部门                        |
+----+-------------+-------------------------------------------+
insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);
mysql> select * from emp;
+----+---------+--------+--------+
| id | name    | gender | dep_id |
+----+---------+--------+--------+
|  1 | alex    | male   |      1 |
|  2 | egon    | male   |      2 |
|  3 | lxx     | male   |      1 |
|  4 | wxx     | male   |      1 |
|  5 | wenzhou | female |      3 |
+----+---------+--------+--------+
复制代码

约束3:更新与删除都需要考虑到关联与被关联的关系(不能直接改变dep表的id)  解决方案:

 View Code

10.72 多对多(foreign key)

1、什么是多对多 两张表之间是一个双向的多对一关系,称之为多对多 2、如何实现? 建立第三张表,该表中有一个字段是fk左表的id,还有一个字段是fk右表的id

复制代码
create table author(
    id int primary key auto_increment,
    name char(16));
create table book(
    id int primary key auto_increment,
    bname char(16),
    price int);
insert into author(name) values
('egon'),
('alex