mysql约束条件,修改表结构,mysql键值

一.约束条件 : 限制给字段赋值  :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;          
 


 

猜你喜欢

转载自blog.csdn.net/weixin_43669585/article/details/89878559