zoukankan      html  css  js  c++  java
  • 字段的约束条件

    一 字段的约束条件
              控制如何给字段赋值
                     Null | Key | Default | Extra |                             
                                           Null : 是否允许为空 默认为yes
                                           Key  : MySQL 键值
                                           Default:当插入数值时,不插入数据时的默认值
                                           EXtra:额外设置,自动增长
    1.1 Null和Default的使用
                                              #创建表结构db2.t7,健表过程中使用约束条件
    mysql> use db2;
    mysql> create table t7(                                                                        
     -> name char(15) not null,
        -> age tinyint unsigned default 25,
        -> class char(9) not null default "nsd1904",
        -> sex enum("man","woman") default "man",
        -> pay float(7,2) default 28000
        -> );
    mysql> desc t7;
    +-------+---------------------+------+-----+----------+-------+
    | Field | Type                | Null | Key | Default  | Extra |
    +-------+---------------------+------+-----+----------+-------+
    | name  | char(15)            | NO   |     | NULL     |       |
    | age   | tinyint(3) unsigned | YES  |     | 25       |       |
    | class | char(9)             | NO   |     | nsd1904  |       |
    | sex   | enum('man','woman') | YES  |     | man      |       |
    | pay   | float(7,2)          | YES  |     | 28000.00 |       |
    +-------+---------------------+------+-----+----------+-------+
    5 rows in set (0.00 sec)
    mysql> 
    
                                              #使用默认值赋值的方法给表中字段赋值
                                              #赋值时有default的字段,如果没有指定数值则会使用默认值
    mysql> insert into t7(name) values("bob");
    Query OK, 1 row affected (0.11 sec)
    mysql> select * from t7;
    +------+------+---------+------+----------+
    | name | age  | class   | sex  | pay      |
    +------+------+---------+------+----------+
    | bob  |   25 | nsd1904 | man  | 28000.00 |
    +------+------+---------+------+----------+
    1 row in set (0.01 sec)
    mysql> 
    
    
                                               #注意:赋空值与不赋值是不一样的
                                               #空值的值是NULL
                                               #不赋值时使用默认值default
    mysql> insert into t7 values("jerry",NULL,"NSD1905","man",3800);
    Query OK, 1 row affected (0.09 sec)
    mysql> insert into t7(name,class,sex,pay) values("xixi","NSD1905","man",8000);
    Query OK, 1 row affected (0.09 sec)
    mysql> select * from db2.t7;
    +-------+------+---------+------+----------+
    | name  | age  | class   | sex  | pay      |
    +-------+------+---------+------+----------+
    | bob   |   25 | nsd1904 | man  | 28000.00 |
    | jerry | NULL | NSD1905 | man  |  3800.00 |
    | xixi  |   25 | NSD1905 | man  |  8000.00 |
    +-------+------+---------+------+----------+
    3 rows in set (0.00 sec)
    mysql>
    
    
    1.2  Extra:自动增长 auto_increment
                      它必须和主键一起使用才生效
    
                                              #创建db2.t6表,把Id设置为主键并设置自动增长
    mysql> use db2;
    mysql> create table t6(
        -> id int primary key auto_increment,
        -> name char(10),
        -> age int,
        -> sex enum("w","m")
        -> );
    mysql> desc t6;
    +-------+---------------+------+-----+---------+----------------+
    | Field | Type          | Null | Key | Default | Extra          |
    +-------+---------------+------+-----+---------+----------------+
    | id    | int(11)       | NO   | PRI | NULL    | auto_increment |
    | name  | char(10)      | YES  |     | NULL    |                |
    | age   | int(11)       | YES  |     | NULL    |                |
    | sex   | enum('w','m') | YES  |     | NULL    |                |
    +-------+---------------+------+-----+---------+----------------+
    
                                               #第一次添加记录时,自增长是0+1,后续记录的id值会自动增长
    mysql> insert into t6(name,age,sex)values("bob",19,"m");
    mysql> insert into t6(name,age,sex)values("tom",21,"m");
    mysql> select * from t6;
    +----+------+------+------+
    | id | name | age  | sex  |
    +----+------+------+------+
    |  1 | bob  |   19 | m    |
    |  2 | tom  |   21 | m    |                #第二条记录的ID会自动增长为2
    +----+------+------+------+     
    
                                               #后续再增加记录时,如果不想使用id为3,则可以手动指令ID的值
                                               #只要不和已有冲突且是增加的即可
    mysql> insert into t6 values(6,"alice",21,"m")                                      
    mysql> delete from t6;                     #清空表记录
    mysql> select * from t6;
                                               #再次使用自动增加时,它会以清除之的最后一个id值6开始自动
                                               #增长而不是重新从0开始
    
    
    1.3 MySQL 键值类型                    -        
                 键值的作用是为了字段赋值时做限制的,根据数据存储要求来决定要不要用键值,用什么类型的键值。
    因为是对字段做限制的,所以这个键值是要放在字段上的。
    index 普通索引 unique 唯一索引 不常用 fulltext 全文索引 不常用 primary key 主键 foreign key 外键 1.3.1 普通索引 使用索引的主机目的是:提高查询数据的速度。
    优点: 通过创建索引,可以保证数据库中第一行数的唯一可以加快数据的查询速度 缺点: 对表中数据进行增 删 改的时候,索引也要跟着调整,降低了维护速度占用物理空间 使用规则: 一个表中可以有多个index字段; 字段的值可以重复,也可以NULL; 通常把做为查询条件的字段为index字段; index标志是MUL ---------------------------------------------------------------------------------- (1)建表的时候创建索引 使用index()函数,如果没有指定索引的名字,那么索引名同字段名。
    #创建表tea4,同时指定索引name,id mysql
    > create table tea4( -> id int, -> name char(1), -> class char(9), -> pay float, -> index(name),index(id) -> ); mysql> desc tea4; #查看索引的标志 +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | MUL | NULL | | | name | char(1) | YES | MUL | NULL | | | class | char(9) | YES | | NULL | | | pay | float | YES | | NULL | | +-------+---------+------+-----+---------+-------+ mysql> show index from tea4G; #查看索引的详细信息 *************************** 1. row ************** Table: tea4 #表名 Non_unique: 1 Key_name: name #索引名 Seq_in_index: 1 Column_name: name Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE #二叉树算法 Comment: Index_comment: ------------------------------------------------------------------------ (2)在已有表中建索引 mysql> create index xxx on t7(name); #在t7表中为name字段创建一个名为xxx的索引 mysql> create index age on t7(age); #索引名和字段同名

    (3)删除索引 #删除t7表中名字为xxx的索引 mysql
    > drop index xxx on t7; mysql> drop index age on t7; (4)查看索引: 删除索引之前如果不知道索引的名字需要先查询索引 mysql> show index from 表名G; (5)验证查询数据时是否使用了索引: explain select * from 表名 where 字段="值" ========================================================================

    1.3.2 primary key 主键 使用规则: 字段不允许重复,且不允许为NULL; 一个表中只能有一个primary key; 如果要使多个字段都作为主键,可以用复合主键,必须一起创建; 通常会把表中唯一标识记录的字段设置为主键,一般用行号ID; 主键通常与auto_increment连用,让字段使用自增长方式赋值; 主键标志PRI; ------------------------------------------------------------------------
    (1)建表的时候同时创建主键
    一旦指定为主键,该字段就自动为能为NULL
    mysql
    > use db2; mysql> create table t8( -> name char(10) primary key, -> id int -> ); mysql> desc t8; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | name | char(10) | NO | PRI | NULL | | | id | int(11) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ -------------------------------------------------------------------------- (2)在已有表中创建主键 #在t7表中把class字段添加为主键 mysql> alter table t7 add primary key (class); (3)删除主键 mysql> alter table t7 drop primary key; -------------------------------------------------------------- (4)复合主键(多个字段一起做主键) 多个字段一起做主键,字段的值不同时重复就可以,复合主键必须一起创建; 主键要一起创建,只有全部主键字段内容全部重复时,才算重复.
    使用场景:两个字段中的任意字段数值可以重复,但两个字段的数值加起来必须唯一, 比如:端口号
    +IP地址,姓名+班级。 #在t5表中把字段name,class一起创建复合主键, mysql> create table t5( -> name char(10), -> class char(7), -> status enum("yes","no"), -> primary key(name,class) -> ); mysql> desc t5; +--------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+-------+ | name | char(10) | NO | PRI | NULL | | | class | char(7) | NO | PRI | NULL | | | status | enum('yes','no') | YES | | NULL | | +--------+------------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> mysql> select * from t5; +------+---------+--------+ | name | class | status | +------+---------+--------+ | bob | nsd1904 | yes |---> | bob | nsd1906 | no |---> #不同时重复不算重复,可以存储成功. | tom | nsd1904 | yes | +------+---------+--------+ 3 rows in set (0.00 sec) mysql> =========================================================================

    1.3.3 foreign key 外键 作用: 外键也是约束给字段赋值的; 插入记录时,字段的值在另一个表字段值范围内选择; 使用规则: 两个表的存储引擎必须是innodb; 两个字段类型要一致; 被参照字段必须要是索引类型的一种(通常是primary key)

    ------------------------------------------------------------------------------ #先创建员工信息表yginfo,id字段使用自动增长。 mysql> create table yginfo( -> yg_id int primary key auto_increment, -> name char(20) -> )engine=innodb; mysql> insert into yginfo(name) values("bob"); mysql> insert into yginfo(name) values("alice"); mysql> insert into yginfo(name) values("tom"); mysql> select * from yginfo; +-------+-------+ | yg_id | name | +-------+-------+ | 1 | bob | | 2 | alice | | 3 | tom | +-------+-------+ (1) 创建工资表,同时创建外键 #创建gzb表,其中gz_id做为外键,该外键参考yginfo表中
    #的yg_id mysql
    > create table gzb( -> gz_id int, -> pay float(7,2), -> foreign key(gz_id) references yginfo(yg_id) -> on update cascade -> on delete cascade -> )engine=innodb; (2) 查看这个表中是否有外键: mysql> show create table gzb G; *************************** 1. row *************************** Table: gzb #表名 Create Table: CREATE TABLE `gzb` ( `gz_id` int(11) DEFAULT NULL, `pay` float(7,2) DEFAULT NULL, KEY `gz_id` (`gz_id`), CONSTRAINT `gzb_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES #外键字段的外键名称是 gzb_ibfk_1 `yginfo` (`yg_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec) (3)外键的同步更新: mysql> select * from gzb; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 2 | 40000.00 | | 3 | 30000.00 | +-------+----------+ #更新yginfo中的yg_id时,那么gbz中的yz_id也会变化 mysql> update yginfo set yg_id=8 where yg_id=2; mysql> select * from gzb;; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 8 | 40000.00 | #2已更新为8 | 3 | 30000.00 | +-------+----------+ (4)外键的同步删除: #删除yginfo表中的yg_id=3的记录时,gzb中的相关联的记录
    #也会自动删除 mysql
    > delete from yginfo where yg_id=3; mysql> select * from gzb; +-------+----------+ | gz_id | pay | +-------+----------+ | 1 | 50000.00 | | 8 | 40000.00 | +-------+----------+ ---------------------------------------------------------------------------------- (5)删除外键: alter table 表名 drop foreign key 外键名; #删除gzb中的外键,使它不再受yginfo表中数据的约束 mysql> alter table gzb drop foreign key gzb_ibfk_1; mysql> show create table gzbG; *************************** 1. row ***************** Table: gzb Create Table: CREATE TABLE `gzb` ( `gz_id` int(11) DEFAULT NULL, `pay` float(7,2) DEFAULT NULL, KEY `gz_id` (`gz_id`) #外键信息已删除 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)
  • 相关阅读:
    第18章 检测点模型
    第17章 发现过拟合和欠拟合
    第16章 学习速率调度器
    第15章 MiniVGGNet:更深的CNNs
    第14章 LeNet:识别手写数字
    第13章保存和加载你的模型
    第12章 训练你的第一个CNN
    Vue.js
    python3第一天
    R+JAVA 中文乱码问题
  • 原文地址:https://www.cnblogs.com/sven-pro/p/13207779.html
Copyright © 2011-2022 走看看