字段的约束条件

Posted sven-pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字段的约束条件相关的知识,希望对你有一定的参考价值。

 

一 字段的约束条件
          控制如何给字段赋值
                 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)

 

以上是关于字段的约束条件的主要内容,如果未能解决你的问题,请参考以下文章

mysql基本数据类型和约束条件

MYSQL创建表的约束条件(可选)

oracle 怎么给字段增加多个条件

数据库之数据类型约束条件

数据库之数据类型约束条件

约束条件