一,约束条件
eg:
mysql> create table t6(
-> name char(10) not null,
-> age tinyint not null default 25,
-> likes set("eat","sleep","game","zhang") default "eat,sleep");
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t2 |
| t3 |
| t4 |
| t5 |
| t6 |
+---------------+
5 rows in set (0.00 sec)
mysql> desc t6;
+-------+-----------------------------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+-----------+-------+
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | NO | | 25 | |
| likes | set('eat','sleep','game','zhang') | YES | | eat,sleep | |
+-------+-----------------------------------+------+-----+-----------+-------+
3 rows in set (0.00 sec)
mysql> insert into t6(name) values("zl");
Query OK, 1 row affected (0.00 sec)
mysql> insert into t6 values("bob","27","game,sleep");
Query OK, 1 row affected (0.00 sec)
mysql> select * from t6;
+------+-----+------------+
| name | age | likes |
+------+-----+------------+
| zl | 25 | eat,sleep |
| bob | 27 | sleep,game |
+------+-----+------------+
2 rows in set (0.00 sec)
二,修改表结构
1,修改表结构语法:
基本语法:
> alter table 表名 执行动作(add/modify/change/drop/rename)
添加新字段:
格式:alter table 表名 add字段名 类型(宽度) 约束条件
可添加 after 字段名; 或者first;
eg:
mysql> desc t4;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| brithday | date | YES | | NULL | |
| start | year(4) | YES | | NULL | |
| uptime | time | YES | | NULL | |
| party | datetime | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table t4 add stu_num char(9) first; //添加新字段(学号)到首位
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t4;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| stu_num | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| brithday | date | YES | | NULL | |
| start | year(4) | YES | | NULL | |
| uptime | time | YES | | NULL | |
| party | datetime | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> alter table t4 add email varchar(30) default "stu@163.com", add tel char(11); //添加新字段(邮箱,电话)
mysql> alter table t4 add class char(7) default "xyy1709" after name; //添加(班级)字段到(名字)之后
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t4;
+----------+-------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+-------------+-------+
| stu_num | char(9) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| class | char(7) | YES | | xyy1709 | |
| brithday | date | YES | | NULL | |
| start | year(4) | YES | | NULL | |
| uptime | time | YES | | NULL | |
| party | datetime | YES | | NULL | |
| email | varchar(30) | YES | | stu@163.com | |
| tel | char(11) | YES | | NULL | |
+----------+-------------+------+-----+-------------+-------+
9 rows in set (0.00 sec)
mysql> select * from t4;
删除表里的字段:
mysql> desc t2;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| age | tinyint(3) unsigned | YES | | NULL | |
| pay | float(7,2) | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> alter table t2 drop age;
修改字段类型: modify
格式: alter tables 表名 modify 字段名 类型(宽度) 约束条件;
mysql> alter table t4 modify stu_num varchar(10);
mysql> desc t4;
+----------+-------------+------+-----+-------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+-------------+-------+
| stu_num | varchar(10) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| class | char(7) | YES | | xyy1709 | |
| brithday | date | YES | | NULL | |
| start | year(4) | YES | | NULL | |
| uptime | time | YES | | NULL | |
| party | datetime | YES | | NULL | |
| email | varchar(30) | YES | | stu@163.com | |
| tel | char(11) | YES | | NULL | |
+----------+-------------+------+-----+-------------+-------+
9 rows in set (0.00 sec)
mysql> desc t6;
+-------+-----------------------------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+-----------+-------+
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | NO | | 25 | |
| likes | set('eat','sleep','game','zhang') | YES | | eat,sleep | |
+-------+-----------------------------------+------+-----+-----------+-------+
3 rows in set (0.00 sec)
mysql> alter table t6 modify age tinyint default 25;
mysql> alter table t6 modify age tinyint default 25 after name;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t6;
+-------+-----------------------------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+-----------+-------+
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | YES | | 25 | |
| likes | set('eat','sleep','game','zhang') | YES | | eat,sleep | |
+-------+-----------------------------------+------+-----+-----------+-------+
3 rows in set (0.00 sec)
mysql> alter table t6 modify
-> likes set("eat","sleep","game","zhang","it","book")
-> null default "it,book";
mysql> desc t6;
+-------+-----------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------------------+------+-----+---------+-------+
| name | char(10) | NO | | NULL | |
| age | tinyint(4) | YES | | 25 | |
| likes | set('eat','sleep','game','zhang','it','book') | YES | | it,book | |
+-------+-----------------------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
修改字段名: change
格式: alter table 表名 change 原字段名 新字段名 类型(宽度) 约束条件;
eg:
mysql> alter table t4 change email mail varchar(30) default "stu@163.com";
删除字段: drop
格式: alter table 表名 drop 字段名;
eg:
mysql> alter table t4 drop class, drop party;
修改表名: rename
格式: alter table 表名 rename 新表名;
eg: > alter table t4 rename stutab;
> show databases;
> select * from stutab;
二,键值
Mysql键值类型
键值类型
普通索引
主键
外键
eg:普通索引的创建
mysql> use db2
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| db2 |
+------------+
1 row in set (0.00 sec)
mysql> show tables;
mysql> create table t1(
-> name char(10),
-> age tinyint not null default 25,
-> likes set("it","book","sleep") default "it"
-> );
创建t2表,将name、age作为索引字段
mysql> create table t2(
-> name char(10) not null,
-> age tinyint not null default 25,
-> likes set("eat","sleep","game","zhang") default "eat,sleep",
-> index(name),index(age) //将name和age作为索引
-> );
Query OK, 0 rows affected (0.02 sec)
查看ti表结构,发现两个非空索引字段的Key的标志为MUL
mysql> desc t2;
+-------+-----------------------------------+------+-----+-----------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+-----------+-------+
| name | char(10) | NO | MUL | NULL | |
| age | tinyint(4) | NO | MUL | 25 | |
| likes | set('eat','sleep','game','zhang') | YES | | eat,sleep | |
+-------+-----------------------------------+------+-----+-----------+-------+
3 rows in set (0.00 sec)
查看表中的索引字段
mysql> show index from t2; //查看指定表的索引信息
mysql> show index from t2\G;
eg:普通索引的删除
mysql> drop index name on t2;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from t2\G;
在已有的某个表中设置INDEX索引字段
比如,针对tea4表的age字段建立索引,名称为 nianling:
mysql> CREATE INDEX nianling ON tea4(age); //针对指定字段创建索引
唯一索引
创建表的时候指定UNIQUE索引字段
UNIQUE表示唯一性的意思,同一个表中可以有多个字段具有唯一性。
比如,创建t3表,将id、name字段建立设置UNIQUE索引,age字段设置INDEX索引:
mysql> create table t3(
-> id char(6),
-> name varchar(4) not null,
-> age int(3) not null,
-> unique(id),unique(name),index(age)
-> );
Query OK, 0 rows affected (0.02 sec)
查看新建t3表的字段结构,可发现UNIQUE字段的KEY标志为UNI;另外,由于字段name必须满足“NOT NULL”的非空约束,所以将其设置为UNIQUE后会自动变成了PRIMARY KEY主键字段:
mysql> desc t3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | char(6) | YES | UNI | NULL | |
| name | varchar(4) | NO | PRI | NULL | |
| age | int(3) | NO | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec
删除
mysql> drop index name on t3;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | char(6) | YES | UNI | NULL | |
| name | varchar(4) | NO | | NULL | |
| age | int(3) | NO | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
重新为t3表的name字段建立unique索引,
mysql> create unique index name on t3(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | char(6) | YES | UNI | NULL | |
| name | varchar(4) | NO | PRI | NULL | |
| age | int(3) | NO | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
主键使用规则:primary key()
创建主键
mysql> create table t4(
-> name char(5),
-> class char(7),
-> stu_num char(9), primary key(stu_num)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t4;
+---------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| name | char(5) | YES | | NULL | |
| class | char(7) | YES | | NULL | |
| stu_num | char(9) | NO | PRI | NULL | |
+---------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> drop table t4;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| t1 |
| t2 |
| t3 |
+---------------+
3 rows in set (0.00 sec)
创建复合主键
mysql> create table t4(
-> clientip char(15),
-> serport smallint unsigned,
-> status enum("allow","deny"),
-> primary key(clientip,serport) //设置主键
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t4;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| clientip | char(15) | NO | PRI | NULL | |
| serport | smallint(5) unsigned | NO | PRI | NULL | |
| status | enum('allow','deny') | YES | | NULL | |
+----------+----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into t4 values("1.1.1.1",22,"deny");
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 values("1.1.1.1",21,"deny");
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4 values("2.1.1.1",21,"allow");
Query OK, 1 row affected (0.00 sec)
删除主键
mysql> alter table t4 drop primary key;
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
在已创建好的表中,添加主键
mysql> alter table t4 add primary key(serport,clientip);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
主键与auto_increment 连用,让字段的值自动增长
条件:数值类型、 必须是primary key
创建字段自增长的表
mysql> create table t5(
-> id int primary key auto_increment,
-> name char(10),
-> age tinyint
-> );
mysql> desc t5;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> insert into t5(name,age) values("zl",19); //表中插入记录
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5(name,age) values("ln",18);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5(name.age) values("Nicoke",18);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into t5(name,age) values("Nicoke",18);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5 where id=3; //观察id字段的值
+----+--------+------+
| id | name | age |
+----+--------+------+
| 3 | Nicoke | 18 |
+----+--------+------+
1 row in set (0.00 sec)
mysql> select * from t5;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | zl | 19 |
| 2 | ln | 18 |
| 3 | Nicoke | 18 |
+----+--------+------+
3 rows in set (0.00 sec)
mysql> insert into t5 values(null,"lucy",22);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5 values(10,"lucy",22);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t5(name,age) values("kenji",20);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5; //id字段值增长
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | zl | 19 |
| 2 | ln | 18 |
| 3 | Nicoke | 18 |
| 4 | lucy | 22 |
| 10 | lucy | 22 |
| 11 | kenji | 20 |
+----+--------+------+
6 rows in set (0.00 sec)
mysql> alter table t5 modify id int not null; //删除自增长
Query OK, 6 rows affected (0.03 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> desc t5;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table t5 drop primary key; //在删除主键
Query OK, 6 rows affected (0.03 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> desc t5;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
创建外键
外键:foreign
使用规则:
存储引擎是innodb
字段类型一致
被参考的字段
基本用法
foreign
references
on update cascade //同步更新
on delete cascade //同步删除
mysql> create table yg(
-> yg_id int primary key auto_increment,
-> name char(10)
-> )engine=innodb;
mysql> desc yg;
mysql> insert into yg(name) values("tom");
mysql> insert into yg(name) values("lili");
mysql> select * from yg;
eg: 创建外键
mysql> create table gz(
-> gz_id int,
-> pay float(7,2),
-> foreign key(gz_id) references yg(yg_id)
-> on update cascade on delete cascade
-> )engine=innodb;
mysql> show create table gz; //查看外键的创建命令,外键名
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| gz | CREATE TABLE `gz` (
`gz_id` int(11) DEFAULT NULL,
`pay` float(7,2) DEFAULT NULL,
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 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql> select * from yg;
+-------+------+
| yg_id | name |
+-------+------+
| 1 | tom |
| 2 | lili |
+-------+------+
2 rows in set (0.00 sec)
mysql> select * from gz;
Empty set (0.00 sec)
mysql> insert into gz values(1,20000);
Query OK, 1 row affected (0.00 sec)
mysql> insert into gz values(1,15000);
Query OK, 1 row affected (0.00 sec)
mysql> select * from gz;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 20000.00 |
| 1 | 15000.00 |
+-------+----------+
2 rows in set (0.00 sec)
mysql> insert into yg(name) values ("ritama");
Query OK, 1 row affected (0.00 sec)
mysql> insert gz values(3,10000);
Query OK, 1 row affected (0.00 sec)
mysql> select * from gz;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 20000.00 |
| 1 | 15000.00 |
| 3 | 10000.00 |
+-------+----------+
mysql> insert into yg(name) values("juck");
mysql> insert into yg values(null,"ben");
mysql> select * from yg;
+-------+--------+
| yg_id | name |
+-------+--------+
| 1 | tom |
| 2 | lili |
| 3 | ritama |
| 4 | juck |
| 5 | ben |
+-------+--------+
mysql> select * from gz;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 1 | 20000.00 |
| 1 | 15000.00 |
| 3 | 10000.00 |
+-------+----------+
同步删除,更新
mysql> delete from yg where yg_id=1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from yg;
+-------+--------+
| yg_id | name |
+-------+--------+
| 2 | lili |
| 3 | ritama |
| 4 | juck |
| 5 | ben |
+-------+--------+
mysql> select * from gz;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 3 | 10000.00 |
+-------+----------+
mysql> update yg set yg_id=8 where yg_id=2;
Query OK, 1 row affected (0.00 sec)
mysql> select * from yg;
+-------+--------+
| yg_id | name |
+-------+--------+
| 3 | ritama |
| 4 | juck |
| 5 | ben |
| 8 | lili |
+-------+--------+
4 rows in set (0.00 sec)
mysql> select * from gz;
+-------+----------+
| gz_id | pay |
+-------+----------+
| 3 | 10000.00 |
+-------+----------+
1 row in set (0.00 sec
mysql> delete from gz; //删除工资表的记录
mysql> alter table gz add primary key(gz_id); //添加主键
mysql> desc gz;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| gz_id | int(11) | NO | PRI | NULL | |
| pay | float(7,2) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
mysql> insert into gz values(8,20000);
Query OK, 1 row affected (0.00 sec)
mysql> insert into gz values(4,10432);
Query OK, 1 row affected (0.00 sec)
删除外键:
> show create table yg; //看外键名
> alter table gz drop foreign key gz_ibfk_1;
> show create table gz;
> alter table yg drop yg_id; //删除员工表字段
> drop table yg; //删除员工表