表结构
约束条件
- 作用: 限制给字段赋值
- 限制如下:
- NULL 字段是否允许赋空(null)值 not null
- NOT NULL 不允许为null (空)
- Key 键值类型 (普通索引index , 唯一索引 unique , 主键 primary key , 外键 foreign key , 全文索引 fileindex)
- 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 字符, 不是空
- Extra 额外设置
- 如timestamp 额外设置为系统设置
修改表结构
- 命令格式: mysql > alter table 库.表 执行动作;
- 执行动作:
- 添加新字段
- 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键值
键值类型, 根据数据存储要求, 选择键值
- index 普通索引
- unique 唯一索引
- fulltext 全文索引
- primary key 主键
- foreign key 外键
普通索引的使用
- 使用规则 (限制的方式)
- 创建 给字段加标志
- 删除 删除字段的标志
- 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(字段名列表);
- 多列做主键,避免相同信息重复出现,而不能添加
- 插入表记录时,符合主键字段的值不同时重复即可
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; #指定存储引擎