MySql表结构-键值(索引,主键,外键)


表结构

约束条件

  • 作用: 限制给字段赋值
  • 限制如下:
  1. NULL 字段是否允许赋空(null)值 not null
    • NOT NULL 不允许为null (空)
  2. Key 键值类型 (普通索引index , 唯一索引 unique , 主键 primary key , 外键 foreign key , 全文索引 fileindex)
  3. Default 设置默认值, 缺省为NULL
    • 不给某一字段赋值时, 默认为null
    • timestamp 类型, 添加数据时未配置值,默认为 当前时间 (current_timestamp)
mysql> desc db11.t8;
+--------------+-----------+------+-----+-------------------+-----------------------------+
| Field        | Type      | Null | Key | Default           | Extra                       |
+--------------+-----------+------+-----+-------------------+-----------------------------+
| create_time  | datetime  | YES  |     | NULL              |                             |
| meeting_time | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)
- create table t9(class char(7) not null default "nsd2005" , name char(10) not null);
-                           不允许为空    默认值为 nsd2005
mysql> create table db11.t9(
    -> class varchar(7) not null default "nsd2005",    //  定义非空, 设定默认值
    -> name  varchar(10) not null,                     // name  NULL 属性不能为空
    -> sex  enum("boy","girl") default "boy");        //sex 枚举类型,单选,  默认为boy
Query OK, 0 rows affected (0.04 sec)

mysql> insert into db11.t9(name) values('tom');
Query OK, 1 row affected (0.00 sec)

mysql> insert into db11.t9 values("nsd2006","tom","girl");
Query OK, 1 row affected (0.00 sec)

mysql> select * from db11.t9;
+---------+------+------+
| class   | name | sex  |
+---------+------+------+
| nsd2005 | tom  | boy  |
| nsd2006 | tom  | girl |
+---------+------+------+
2 rows in set (0.00 sec)

mysql> desc db11.t9;
+-------+--------------------+------+-----+---------+-------+
| Field | Type               | Null | Key | Default | Extra |
+-------+--------------------+------+-----+---------+-------+
| class | varchar(7)         | NO   |     | nsd2005 |       |
| name  | varchar(10)        | NO   |     | NULL    |       |
| sex   | enum('boy','girl') | YES  |     | boy     |       |
+-------+--------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into db11.t9 values("nsd2004","wangh",null);    // sex 字段可以为空
Query OK, 1 row affected (0.00 sec)

mysql> insert into db11.t9 values(null,'hhhh',null);
ERROR 1048 (23000): Column 'class' cannot be null              // class 不允许赋空值
mysql> 

mysql> select * from db11.t9;
+---------+-------+------+
| class   | name  | sex  |
+---------+-------+------+
| nsd2005 | tom   | boy  |
| nsd2006 | tom   | girl |
| nsd2004 | wangh | NULL |
+---------+-------+------+
3 rows in set (0.00 sec)
  • 注意:
    • “” 为0个字符 , 不是空
    • “null” 为 null 字符, 不是空
  1. Extra 额外设置
  • timestamp 额外设置为系统设置

修改表结构

  • 命令格式: mysql > alter table 库.表 执行动作;
  • 执行动作:
    1. 添加新字段
      • add 字段名 类型 [约束条件] first;
      • add 字段名 类型 [约束条件] after 列名;
      • add 字段名 类型 [约束条件]; ------------>默认在最后列后添加
## 查看 t2表属性
mysql> desc t2;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | char(5)             | YES  |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | NULL    |       |
| money | float               | YES  |     | NULL    |       |
| pai   | double              | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

## alter 表t2 新增 class 列, 可包含7个字符, 默认名为 nsd2005
mysql> alter table db11.t2 add class char(7) default 'nsd2005';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

## alter 表t2  新增 stu_num 列, 数字(255) , 在first 第一列插入
mysql> alter table db11.t2 add stu_num  tinyint first;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

## alter 表t2  新增 sex 列, enum 单选枚举类型 , 不能为空,  默认为 boy , 在 name 列后面添加
mysql> alter table db11.t2 add sex enum("boy","girl") not null default "boy" after name;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

## 添加多个列
mysql> alter table db11.t2 add qq varchar(11), add tel char(11);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from db11.t2;
Empty set (0.00 sec)

mysql> desc db11.t2;
+---------+---------------------+------+-----+---------+-------+
| Field   | Type                | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+-------+
| stu_num | tinyint(4)          | YES  |     | NULL    |       |
| name    | char(5)             | YES  |     | NULL    |       |
| sex     | enum('boy','girl')  | NO   |     | boy     |       |
| age     | tinyint(3) unsigned | YES  |     | NULL    |       |
| money   | float               | YES  |     | NULL    |       |
| pai     | double              | YES  |     | NULL    |       |
| class   | char(7)             | YES  |     | nsd2005 |       |
| qq      | varchar(11)         | YES  |     | NULL    |       |
| tel     | char(11)            | YES  |     | NULL    |       |
+---------+---------------------+------+-----+---------+-------+
9 rows in set (0.00 sec)
  • 执行动作
    2. 删除已有字段 (删几个需要 写几个 drop) 招普
    - drop 列表名;
    - drop 列表名, drop 列表名
    3. 只修改字段类型不能修改字段名, 可改类型,约束条件----是否为空,,默认值)
    - modify 字段名 类型 约束条件;
    - 修改的字段类型时,需要与表中的已有数据值匹配,如type为int 更改为var,与表中数据冲突, 将会报错
    - 调整字段位置
    alter db11.t2 modify 原有属性不变 after name; -------> 调到name列之后
    4. 修改字段命令 change (字段名,类型,约束条件均可更改,但需要与标志数据相匹配)
    - change 字段名 类型 约束条件;
    - 单独改字段名 , 字段类型和约束条件原样不变
    - 改名又改类型, 指定新的字段名 和 类型
    5. 修改表名 rename
    - alter table 表名 rename 新表名;

MySql键值

键值类型, 根据数据存储要求, 选择键值

  1. index 普通索引
  2. unique 唯一索引
  3. fulltext 全文索引
  4. primary key 主键
  5. foreign key 外键

普通索引的使用

  1. 使用规则 (限制的方式)
  2. 创建 给字段加标志
  3. 删除 删除字段的标志
  • 1. index介绍
  • 表中字段值进行排序(即排队)
  • 类型: Btree(二叉树) , B + tree , hash
  • 优点
    • 创建唯一性索引, 保证每一行数据的唯一性
    • 加快数据的查询速度
  • 缺点
    • 表的数据增删改查, 索引也动态调整, 降低数据的维护速度
    • 索引需要占用物理空间(排队信息)

生产环境中以查询操作为主, 主要针对查询性数据,优点大于缺点

  • 2. 使用规则

    • 一个表中可以有多个index字段
    • 字段的值允许重复,且可以赋NULL值 (约束条件允许为NULL时才可赋值为空)
    • 通常把作为查询条件的字段设置为index字段
    • index字段标志时MUL
  • 3. 创建索引 给字段加标记(index)

    • 建表时创建索引
      • index(字段名), index(字段名)…
    • 已有表中创建索引
      • create index 索引名 on 表名(字段名);
    • 索引名可以自定义, 但不能和其他字段 已有的索引名重复
      • 同一字段名,可以设多个不同索引, 但不同字段名 的 索引 不能一样。
mysql> create index id on db11.t11(age);
ERROR 1061 (42000): Duplicate key name 'id'
//                   重复     的键 名称  id

字段类型为 blob 或 text ,大文本格式, 不支持索引
在这里插入图片描述

  • 4. 删除索引
    • drop index 索引名 on 表名;

在这里插入图片描述

  • 5. 查看索引
    • show index from 库名.表名;
    • show index from 库名.表名 \G;

在这里插入图片描述

有四种类型的语句表添加索引:
    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list); 添加一主键,索引值必须是唯一的,不能是NULL。
    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list); 创建一索引,其值必须是唯一的(除NULL值,这可能会多次出现)
    ALTER TABLE tbl_name ADD INDEX index_name (column_list); 增加了普通索引,其中的任何值,可能会出现多于一次
    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);创建一特殊的FULLTEXT索引,用于文本搜索的目的

主键primary key 的使用

  • 使用规则

    • 字段值不允许重复, 且不允许赋NULL值
    • 一个表中只能有一个primary key字段
    • 多个字段都作为主键, 称为复合主键, 必须一起创建
    • 主键字段的标志是 PRI
    • 主键通常与 auto_increment 连用 (自增长), 但字段类型必须是数字型, 且不能为空和重复
    • 通常把表中唯一标识记录的字段设置为主键 , 如 记录编号
  • 创建 主键

  • 建表时创建

    • primary key(字段名)
    • create table t88(name char(3) primary key,id int);
  • 已有表中添加主键

    • alter table 表名 add primary key(字段名);
  • 删除主键

  • alter table 表名 drop primary key;
    在这里插入图片描述

  • 创建复合主键

  • primary key(字段名列表);

在这里插入图片描述

  • 多列做主键,避免相同信息重复出现,而不能添加
  • 插入表记录时,符合主键字段的值不同时重复即可
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3Sp0LeV-1597412912116)(F2474C52FBE84D3EA62036F35CBA1DB3)]
create table db11.t22(ipaddr char(15), sport smailint,stat enum('allow','deny'),primary key(ipaddr,sport);
desc db1,t13;
indert into db11.t22 values('1.1.1.1',22,'allow');
insert into db11.t22 values('1.1.1.2',22,'deny');
  • 因符合主键,需要两字段的值组合后不同,才能添加进去,
mysql> insert into t22 values('1.1.1.1',22,'deny');
ERROR 1062 (23000): Duplicate entry '1.1.1.1-22' for key 'PRIMARY'
mysql> insert into t22 values('1.1.1.2',80,'deny');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t22;
+---------+-------+-------+
| ipaddr  | sport | stat  |
+---------+-------+-------+
| 1.1.1.1 |    22 | allow |
| 1.1.1.1 |    23 | deny  |
| 1.1.1.2 |    80 | deny  |
+---------+-------+-------+
3 rows in set (0.00 sec)

在这里插入图片描述

  • 与auto_increment 连用, 必须时主键,且时字段类型为数值类型
    • create table db11.t44(id int(11) primary key auto_increment,name char(11),age int,class char(7),tel char(11);
    • dsec db11.t44;
    • insert into db11.t44(name,age,class,tel) values(‘bob’,19,‘ddd2011’,‘037766666’);
  • 生产环境中,做行号字段, 值不能为空的列,设置为主键,实现其功能。
mysql> select * from t44;
+----+--------+------+---------+-------------+
| id | name   | age  | class   | tel         |
+----+--------+------+---------+-------------+
|  1 | homan1 |   22 | yry111  | 032245455   |
|  2 | homan2 |   24 | yryddd1 | 03442245455 |
|  3 | homan3 |   24 | yryddd1 | 03442245455 |
|  4 | homan4 |   27 | ydddd1  | 03442245455 |
|  8 | homan4 |   27 | ydddd1  | 03442245455 |
+----+--------+------+---------+-------------+
5 rows in set (0.00 sec)

mysql> insert into t44(name,age,class,tel) values('homan6',127,'ydddd1','03442245455');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t44;
+----+--------+------+---------+-------------+
| id | name   | age  | class   | tel         |
+----+--------+------+---------+-------------+
|  1 | homan1 |   22 | yry111  | 032245455   |
|  2 | homan2 |   24 | yryddd1 | 03442245455 |
|  3 | homan3 |   24 | yryddd1 | 03442245455 |
|  4 | homan4 |   27 | ydddd1  | 03442245455 |
|  8 | homan4 |   27 | ydddd1  | 03442245455 |
|  9 | homan6 |  127 | ydddd1  | 03442245455 |
+----+--------+------+---------+-------------+
6 rows in set (0.00 sec)

外键foreign key (难点)

  • 外键功能

    • 插入记录时, 字段值在另一个表字段值范围内 选择。
    • 给外键字段赋值时,字段的值在另一个表字段值的范围内选择。
  • 使用规则

    • 表的存储引擎必须是innodb , 使用的和引用的表的存储引擎均要是innodb
    • create table 表(字段名 类型…) engined(innodb)
    • 字段类型要一致
    • 被参考字段的值必须是唯一的, 如索引类型设置为primary key
  • 命令格式

  • 创建 外键

create table 表名(
    字段名列表,
    foreign key(字段名) references 表名(字段名)  # 指定外键
    on update cascade              #同步更新 
    on delete cascade              #同步删除
    )engine=innodb;               #指定存储引擎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值