一.约束条件 : 限制给字段赋值 :null(空),键值,默认值,额外值
mysql> create database db2; #建立db2库
mysql> use db2 #进入db2库
mysql> create table t1( #建立t1表
-> class char(9),
-> name char(10) not null , #限制name 字段不能为null
-> age tinyint not null default 19, ##限制age字段不能为null ,而且不赋值是默认是19
-> likes set ("a","b","c","d") default "a,b"
-> );
mysql> desc t1; # 查看表结构
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| class | char(9) | YES | | NULL | |
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | NO | | 19 | |
| likes | set('a','b','c','d') | YES | | a,b | |
+-------+----------------------+------+-----+---------+-------+
mysql> insert into t1 values (null,"bob",29,"c,d");
mysql> select * from t1;
+-------+------+-----+-------+
| class | name | age | likes |
+-------+------+-----+-------+
| NULL | bob | 29 | c,d |
+-------+------+-----+-------+
mysql> insert into t1 (class,name) values ("nsd1902","tom"); #当只是给 class,name 赋值是,其他的则给默认值
mysql> select * from t1;
+---------+------+-----+-------+
| class | name | age | likes |
+---------+------+-----+-------+
| NULL | bob | 29 | c,d |
| nsd1902 | tom | 19 | a,b |
+---------+------+-----+-------+
mysql> insert into t1 values (null,null,null,null); #报错因为第2列和第3列不允许赋空值;
ERROR 1048 (23000): Column 'name' cannot be null
mysql> insert into t1 values (null,"",12,null); # 零个字符,也不是空
mysql> select * from t1;
+---------+------+-----+-------+
| class | name | age | likes |
+---------+------+-----+-------+
| NULL | bob | 29 | c,d |
| nsd1902 | tom | 19 | a,b |
| NULL | | 12 | NULL |
+---------+------+-----+-------+
mysql> insert into t1 values (null,"null",12,null); #null里面加了“”双引号,表示普通字符;
Query OK, 1 row affected (0.07 sec)
mysql> select * from t1;
+---------+------+-----+-------+
| class | name | age | likes |
+---------+------+-----+-------+
| NULL | bob | 29 | c,d |
| nsd1902 | tom | 19 | a,b |
| NULL | | 12 | NULL |
| NULL | null | 12 | NULL |
+---------+------+-----+-------+
mysql> create table t2 (
class char(9) default "", #默认值为空字符;
name char(10) not null,
age tinyint not null default 19,
likes set("a","b","c","d") default "a,b"
);
mysql> desc t2;
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| class | char(9) | YES | | | |
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | NO | | 19 | |
| likes | set('a','b','c','d') | YES | | a,b | |
+-------+----------------------+------+-----+---------+-------+
2修改表结构 (add 添加字段 ,modify 修改字段类型,change 修改字段名,drop 删除字段,rename 修改表名)
alter table 表名 add/modify 新字段
添加
mysql> desc t5; #利用原来创建的表格 修改表的结构,未修改时如下结构:
+-------+----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------------------+------+-----+---------+-------+
| name | char(5) | YES | | NULL | |
| likes | set('eat','game','film','music') | YES | | NULL | |
| sex | enum('boy','girl','no') | YES | | NULL | |
+-------+----------------------------------+------+-----+---------+-------+
mysql> select * from t5;
+------+----------+------+
| name | likes | sex
+------+----------+------+-
| bob | eat,game | boy
+------+----------+------+
mysql> alter table t5 add mail varchar(50) default "[email protected]"; #添加mail字段,会在表里内容添加mail字段
mysql> select * from t5;
+------+----------+------+-------------+
| name | likes | sex | mail |
+------+----------+------+-------------+
| bob | eat,game | boy | [email protected] |
+------+----------+------+-------------+
mysql> alter table t5 add qq char(11) ,add tel char(11); # 添加的新字段不赋与默认值时,给的NULL
mysql> select * from t5;
+------+----------+------+-------------+------+------+
| name | likes | sex | mail | qq | tel |
+------+----------+------+-------------+------+------+
| bob | eat,game | boy | [email protected] | NULL | NULL |
+------+----------+------+-------------+------+------+
mysql> alter table t5 add stu_num char(9) first;
mysql> select * from t5;
+---------+------+----------+------+-------------+------+------+
| stu_num | name | likes | sex | mail | qq | tel |
+---------+------+----------+------+-------------+------+------+
| NULL | bob | eat,game | boy | [email protected] | NULL | NULL |
+---------+------+----------+------+-------------+------+------+
mysql> alter table t5 add pay float(7,2) default 20000 after name; # 将新加的pay字段放在name字段的后面
mysql> select * from t5;
+---------+------+----------+----------+------+-------------+------+------+
| stu_num | name | pay | likes | sex | mail | qq | tel |
+---------+------+----------+----------+------+-------------+------+------+
| NULL | bob | 20000.00 | eat,game | boy | [email protected] | NULL | NULL |
+---------+------+----------+----------+------+-------------+------+------+
修改字段类型: (不能与已有的字段冲突)
alter table 表名 modify 字段名 char(11) not null; # 字段名后面接需要修改的字段类型,其他不变的也需要写进去
mysql> delete from db1.t5;
mysql> desc t5;
+---------+----------------------------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------------------------------+------+-----+-------------+-------+
| stu_num | char(9) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| pay | float(7,2) | YES | | 20000.00 | |
| likes | set('eat','game','film','music') | YES | | NULL | |
| sex | enum('boy','girl','no') | YES | | NULL | |
| mail | varchar(50) | YES | | [email protected] | |
| qq | char(11) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+----------------------------------+------+-----+-------------+-------+
mysql> alter table t5 modify qq char(11) not null;
mysql> alter table t5 modify mail char(50) default "[email protected]";
mysql> alter table t5 modify sex enum('boy','girl','no') after name;
mysql> desc t5;
+---------+----------------------------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------------------------------+------+-----+-------------+-------+
| stu_num | char(9) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| sex | enum('boy','girl','no') | YES | | NULL | |
| pay | float(7,2) | YES | | 20000.00 | |
| likes | set('eat','game','film','music') | YES | | NULL | |
| mail | char(50) | YES | | [email protected] | |
| qq | char(11) | NO | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+----------------------------------+------+-----+-------------+-------+
修改字段名 change
格式: alter table 表名 change 旧字段名 新字段名
mysql> alter table t5 change stu_num stu_id char(9);
mysql> alter table t5 change mail email varchar(30) no null default "[email protected]"; # change 也可以修改字段类型
mysql> desc t5
-> ;
+--------+----------------------------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------------------+------+-----+-------------+-------+
| stu_id | char(9) | YES | | NULL | |
| name | char(5) | YES | | NULL | |
| sex | enum('boy','girl','no') | YES | | NULL | |
| pay | float(7,2) | YES | | 20000.00 | |
| likes | set('eat','game','film','music') | YES | | NULL | |
| email | varchar(30) | NO | | [email protected] | |
| qq | char(11) | NO | | NULL | |
| tel | char(11) | YES | | NULL | |
+--------+----------------------------------+------+-----+-------------+-------+
删除字段名 drop
格式: alter table 表名 drop 字段名(需要删除的)
mysql> alter table t5 drop sex,drop likes;
修改表名 rename
格式 : alter table 源表名 rename 新表名
mysql> alter table t5 rename student_info;
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| 学生信息 |
| a |
| student_info |
| t1 |
| t2 |
| t3 |
| t4 |
| t6 |
| t7 |
+---------------+
3 Mysql 键值
每种键都对表记录有插入限制,且有各自的功能
种类:
普通索引 :index *
唯一索引 :unique
主键 : primary key *
外键: foreign key *
全文索引 fulltext
索引的定义:索引是对记录集多个字段进行排序的方法
索引的类型包括:Btree(二叉树) B+tree hash #排列的方式
索引的优缺点:
优点:加快数据的检索速度
缺点:占用物理空间 ,降低了数据的维护速度
普通引索index :
特点: 一个表中可以给多个index字段,字段的值允许有重复,且可以赋NULL值 ,index字段的key标志是mul
排队信息 /var/lib/mysql/db1/t1.frm t1.idb
查看索引信息: show index from 表名\G
索引名字 key_name
删除索引: drop index 索引名 on 表名
mysql> use db2 # 进入db2库里
mysql> create table t3( name char(10), age tinyint, sex enum ("m","w"), index(name), index(age) ); #建立表
mysql> desc t3;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| name | char(10) | YES | MUL | NULL | |
| age | tinyint(4) | YES | MUL | NULL | |
| sex | enum('m','w') | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
mysql> show index from t3\G; # 查看索引信息
mysql> drop index name on t3; # 在t3库里 删除name 字段里的索引
mysql> show index from t3\G;
在已有表里面设置INDEX字段
格式:create index 索引名 on db2.t1(字段名)
mysql> create index aaa on db2.t1(name); # db2.t1里name 字段里,添加索引index,索引名字为aaa
mysql> create index age on db2.t1(age); #
mysql> desc t1;
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| class | char(9) | YES | | NULL | |
| name | char(10) | NO | MUL | NULL | |
| age | tinyint(4) | NO | MUL | 19 | |
| likes | set('a','b','c','d') | YES | | a,b | |
+-------+----------------------+------+-----+---------+-------+
mysql> show index from db2.t1\G;
primary key 主键 : 使用规则 查看 创建 删除
mysql> create table t4(
-> class char(7),
-> name char(10),
-> age tinyint,
-> stu_id char(9) primary key # 格式1
-> );
mysql> create table t5( class char(7), name char(10), age tinyint, stu_id char(9), primary key(stu_id) ); #格式2
mysql> desc t4;desc t5; #查看表结构
mysql> insert into t4 value ("nsd1902","lucy","16","nsd190208"); #添加表内容
mysql> insert into t4 value ("nsd1902","lilei","21","nsd190208"); #拥有primary key的字段的不允许重复
ERROR 1062 (23000): Duplicate entry 'nsd190208' for key 'PRIMARY'
mysql> insert into t4 value ("nsd1902","lilei","21",null); #拥有primary key的字段的不允许重复,不可以赋值为null
ERROR 1048 (23000): Column 'stu_id' cannot be null
mysql> insert into t4 value ("nsd1902","lilei","21","nsd190220");
Query OK, 1 row affected (0.06 sec)
在已有表中的设置primary key 字段:
alter table 表名 add primary key(字段名);
mysql> alter table db2.t1 add primary key(class); # 在db2库里面的t1表里面 的class 字段添加 primary key;
复合主键的作用:
所有字段不同时一样就说明不重复,防止在特殊字符里面有1,2两个是重复的而导致不能写入,所有字段里面的内容是不能重复的,如果重复了就不能写入
mysql> create table t6 (
-> class char(7),
-> name char(15),
-> pay enum("yes","no") default "no",
-> primary key (class,name,pay)
-> );
mysql> desc t6;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| class | char(7) | NO | PRI | NULL | |
| name | char(15) | NO | PRI | NULL | |
| pay | enum('yes','no') | NO | PRI | no | |
+-------+------------------+------+-----+---------+-------+
mysql> insert into t6 values ("nsd1902","longlog","yes");
Query OK, 1 row affected (0.04 sec)
mysql> insert into t6 values ("nsd1902","longlog","yes"); # 三个字段同时一样是不能创建的
ERROR 1062 (23000): Duplicate entry 'nsd1902-longlog-yes' for key 'PRIMARY'
mysql> insert into t6 values ("nsd1902","longlog","no"); # 可以创建
mysql> select * from t6;
+---------+---------+-----+
| class | name | pay |
+---------+---------+-----+
| nsd1902 | longlog | yes |
| nsd1902 | longlog | no |
+---------+---------+-----+
mysql> alter table db2.t6 drop primary key; # 删除复合主键
mysql> desc t6;
mysql> alter table db2.t6 add primary key(class,name,pay);#添加复合主键
mysql> desc t6;
通常和 AUTO_INCREMENT连用: 让字段的值 自增长 (i++ i=i+1)
要求字段的类型是数值类型且是primary key;
mysql> create table t7(
-> id int primary key auto_increment,
-> name char(15),
-> sex enum("w","m"),
-> age tinyint,
-> class char(7)
-> );
mysql> desc t7;
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(15) | YES | | NULL | |
| sex | enum('w','m') | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| class | char(7) | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+
mysql> insert into t7(name,sex,age,class) values("bob","m",21,"nsd1902");
mysql> insert into t7(name,sex,age,class) values("tom","m",19,"nsd1902");
mysql> select * from t7;
+----+------+------+------+---------+
| id | name | sex | age | class |
+----+------+------+------+---------+
| 1 | bob | m | 21 | nsd1902 |
| 2 | tom | m | 19 | nsd1902 | # id 是自增长的 i++
+----+------+------+------+---------+
mysql> insert into t7 values(9,"tom","m",19,"nsd1902");
mysql> insert into t7(name,sex,age,class) values("jerry","m",24,"nsd1902");
mysql> select * from t7;
+----+-------+------+------+---------+
| id | name | sex | age | class |
+----+-------+------+------+---------+
| 1 | bob | m | 21 | nsd1902 |
| 2 | tom | m | 19 | nsd1902 |
| 9 | tom | m | 19 | nsd1902 |
| 10 | jerry | m | 24 | nsd1902 | #id 由9后面添加
+----+-------+------+------+---------+
mysql> select * from t7 where id=2;
外键
定义:让当前表字段的值在另一个表中的字段值的范围内选择;
使用规则:表的存储引擎必须是innodb;
两个表中的字段类型要一致;
被参照字段必须要是索引类型的一种(primary key) # 意思是字段里面的值不能为null并且不能重复
格式: foreign key(表A的字段名)
references 表B(字段名)
on update cascade
on delete cascade
mysql> create database db3;
mysql> use db3;
mysql> create table yg(
yg_id int primary key auto_increment,
name char(15)
)engine=innodb; #添加存储引擎innodb
mysql> desc yg;
mysql> create table gz( gz_id int, gz float(7.2) default "20000", foreign key(gz_id) references yg(yg_id) on update cascade on delete cascade)engine=innodb;
Query OK, 0 rows affected (0.29 sec)
mysql> desc gz;
mysql> desc gz;
mysql> insert into yg(name) values("bob");
mysql> insert into yg(name) values("bob");
mysql> select * from yg;
+-------+------+
| yg_id | name |
+-------+------+
| 1 | bob |
| 2 | tom |
| 3 | lucy |
+-------+------+
3 rows in set (0.00 sec)
mysql> insert into gz values(4,30000);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db3`.`gz`, CONSTRAINT `gz_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE)
mysql> update yg set yg_id=8 where yg_id=2; # 验证同步更新
mysql> select * from yg;
+-------+------+
| yg_id | name |
+-------+------+
| 1 | bob |
| 3 | lucy |
| 8 | tom |
+-------+------+
3 rows in set (0.00 sec)
mysql> select * from gz;
+-------+-------+
| gz_id | gz |
+-------+-------+
| 1 | 30000 |
| 8 | 20000 |
| 3 | 20000 |
+-------+-------+
mysql> delete from yg where yg_id=8; #删除表A的字段 ,此时表B的字段也没有了
mysql> select * from yg;
+-------+------+
| yg_id | name |
+-------+------+
| 1 | bob |
| 3 | lucy |
+-------+------+
2 rows in set (0.00 sec)
mysql> select * from gz;
+-------+-------+
| gz_id | gz |
+-------+-------+
| 1 | 30000 |
| 3 | 20000 |
+-------+-------+
2 rows in set (0.00 sec)
删除外键
mysql> show create table gz\G;
*************************** 1. row ***************************
Table: gz
Create Table: CREATE TABLE `gz` (
`gz_id` int(11) DEFAULT NULL,
`gz` float DEFAULT '20000',
KEY `gz_id` (`gz_id`),
CONSTRAINT `gz_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES `yg` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> alter table gz drop foreign key gz_ibfk_1; #删除外键
mysql> show create table gz\G;
mysql> alter table gz add foreign key(gz_id) references yg(yg_id) on update cascade on delete cascade;
mysql> alter table gz add primary key(gz_id);
mysql> show create table gz\G;