Mysql---约束条件、修改表的结构、键值

版权声明:观极著作 https://blog.csdn.net/weixin_41619143/article/details/88097412

一,约束条件

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 "[email protected]", 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  |     | [email protected] |       |
| 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  |     | [email protected] |       |
| 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 "[email protected]";

删除字段:   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;                                             //删除员工表

猜你喜欢

转载自blog.csdn.net/weixin_41619143/article/details/88097412