热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Mysql修饰符

Mysql修饰符notnull有notnull来修饰的话,往表里添加默认值的时候:数值类型的话,添加的是0字符串类型的话,添加的是空如果数据类型是时间戳类型,添加的默认值是当前时间枚举类型,添加的是第一个预先定...SyntaxHighlighter.all();

Mysql修饰符
 
not null
有not null 来修饰的话,往表里添加默认值的时候:
数值类型的话,添加的是0
字符串类型的话,添加的是空
如果数据类型是时间戳类型,添加的默认值是当前时间
枚举类型,添加的是第一个预先定义的值
  www.2cto.com  
验证举例:
mysql> create table t6(a int not null,b char(10) not null,c timestamp not null,d enum('y','n') not null);
mysql> insert into t6 values();  // 添加默认值(就是values后面为空,什么都不写)
mysql> select * from t6;
+---+---+---------------------+---+
| a | b | c                   | d |
+---+---+---------------------+---+
| 0 |   | 2009-12-28 15:42:17 | y |     
+---+---+---------------------+---+
 
----------------------------------------------------------------------------------------------------------------------------
  www.2cto.com  
default
default修饰符为字段指定一个默认值
 
例子:
> create table t2(id int,name varchar(10),dep varchar(10) default "HR");
> insert into t2 set id=1,name="Lili";
> insert into t2 set id=2,name="Anna";
> insert into t2 set id=3,name="Hebe",dep="MIS";
> select * from t2;
+------+------+------+
| id   | name | dep  |
+------+------+------+
|    1 | Lili | HR   | 
|    2 | Anna | HR   | 
|    3 | Hebe | MIS  | 
+------+------+------+
 
auto_increment
auto_increment修饰符只适用于INT字段,表明MySQL应该自动为该字段生成一个数(每次在前一个值得基础上加1)。
MySQL的表只能有一个auto_increment 字段,而且这个字段必须被定义为键。
 
> create table t3 (id int not null auto_increment primary key,name varchar(10) not null);
> insert into t3(name) values("Anna");
> insert into t3(name) values("Nana");
mysql> select * from t3;
+----+------+
| id | name |
+----+------+
|  1 | Anna | 
|  2 | Nana | 
+----+------+
 
-----------------------------------------------------------------------------------
unique
UNI
表示记录不能重复
 
例子:
> create table user(name char(10),email varchar(20) unique);
> insert into user values("Anna","anna@163.com");
> insert into user values("Nana","anna@163.com");
ERROR 1062 (23000): Duplicate entry 'anna@163.com' for key 1
 
 
unique字段null是允许的
mysql> insert into user values();
mysql> insert into user values();
mysql> select * from user;
+------+--------------+
| name | email        |
+------+--------------+
| Anna | anna@163.com | 
| NULL | NULL         | 
| NULL | NULL         | 
+------+--------------+
 
删除unique
> alter table user drop index email;
 
设置unique属性的两种方法:
> create table t10(name char(10),email varchar(20) unique); 
> create table t11(id int,name char(10),unique(id));
 
------------------------------------------------------------------------------------------------------------
 
索引
MUL
为了加快搜索速度,减少查询时间,  MySQL允许我们为一个表的特定字段设置索引
索引的缺点:它占据一定的磁盘空间,而且它影响INSERT,UPDATE和DELETE执行的时间
 
添加索引
> create table sales(name char(4),price float(4,2),date date,index name_index(name));    // 给字段name添加索引,索引的名称是name_index; 如果没有定义索引名称,则使用字段名称做为索引的名称
 
查看索引
> show index from sales; 
 
为多个字段添加索引
> create table sales2(name char(4),price float(4,2),date date,index name_index(name),index (price));
> create table sales3(name char(4),price float(4,2),date date,index (name,price));
 
使用create index命令向已存在的表添加索引
> create index id_index on xueke (id);
 
删除索引
> drop index id_index on xueke;
 
------------------------------------------------------------------
 
主键
primary key
 
设置主键的几种方法:
> create table pri(id tinyint not null unique,name char(10));   // not null unique
> create table pri(id tinyint primary key,name char(10));
> create table pri(id tinyint,name char(10),primary key(id));
 
组合主键
> create table firewall(host varchar(20),port smallint(4),access enum('deny','allow'),primary key(host,port));
> insert into firewall values('192.168.10.1',21,'deny');
> insert into firewall values('192.168.10.1',80,'deny');
> insert into firewall values('192.168.10.2',80,'deny');
> insert into firewall values('192.168.10.2',80,'deny');
ERROR 1062 (23000): Duplicate entry '192.168.10.2-80' for key 1
mysql> select * from firewall;
+--------------+------+--------+
| host         | port | access |
+--------------+------+--------+
| 192.168.10.1 |   21 | deny   | 
| 192.168.10.1 |   80 | deny   | 
| 192.168.10.2 |   80 | deny   | 
+--------------+------+--------+
在这种情况下,允许host或者port重复,但不能同时重复
 
-------------------------------------------------------------------------
 
外键
  www.2cto.com  
建立外键:
foreign key...references...
> create table score (id int,name char(10) primary key,math int,phy int) type=innodb;
> create table addr (id int primary key,aname char(10) not null,addr char(255),tel int,index (aname),foreign key (aname) references score (name)) type=innodb;
 
约束:
1. 关系中的所有表必须是InnoDB表
2. 参照的表和字段(必须是primary key,否则会出MySQL - errno:150的错误)是存在 的
3. 组成外键的字段被索引
4. 在外键关系中,字段的数据类型必须相似,这对于大小和符号都必须匹配的整数类型及其重要
 
mysql> insert into score values(1,"Anna",70,80),(1,"John",80,90),(3,"Lisa",50,60);
mysql> select * from score;
+------+------+------+------+
| id   | name | math | phy  |
+------+------+------+------+
|    1 | Anna |   70 |   80 | 
|    1 | John |   80 |   90 | 
|    3 | Lisa |   50 |   60 | 
+------+------+------+------+
 
一旦建立一个外键,MySQL只允许向addr.aname字段输入那些也存在于score.name字段的值
mysql> insert into addr values(1,"Anna","addr...",4334543); 
mysql> insert into addr values(2,"Lucy","addr...",8774366); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db1/addr`, CONSTRAINT `addr_ibfk_1` FOREIGN KEY (`aname`) REFERENCES `score` (`name`))
mysql> select * from addr;
+----+-------+---------+---------+
| id | aname | addr    | tel     |
+----+-------+---------+---------+
|  1 | Anna  | addr... | 4334543 | 
+----+-------+---------+---------+
 
删除外键:
1.  删除有外键的表
> drop table addr;
Query OK, 0 rows affected (0.00 sec)
2.  从表中删除外键
语法:
alter table 表名 drop foreign key 外键名;
show create table 表名;
实验结果 Mysql会报错:    
> alter table addr drop foreign key aname;
ERROR 1025 (HY000): Error on rename of './db1/addr' to './db1/#sql2-5258-7' (errno: 152)
 
on delete cascade子句
cascade删除包含与已删除键值有参照关系的所有记录
 
建表
> create table score (id int,name char(10) primary key,math int) type=innodb;
> create table addr (id int primary key,aname char(10),addr char(255),tel int,index (aname),foreign key (aname) references score (name) on delete cascade) type=innodb;
 
插入记录
> insert into score values(1,"Nana",50),(2,"Hebe",70);
> insert into addr values(1,"Nana","addr...",6668787),(2,"Hebe","addr...",8989666);
> select * from score;
+------+------+------+
| id   | name | math |
+------+------+------+
|    1 | Nana |   50 | 
|    2 | Hebe |   70 | 
+------+------+------+
> select * from addr;
+----+-------+---------+---------+
| id | aname | addr    | tel     |
+----+-------+---------+---------+
|  1 | Nana  | addr... | 6668787 | 
|  2 | Hebe  | addr... | 8989666 | 
+----+-------+---------+---------+
 
删除score表中Hebe的记录,addr表中Hebe的记录自动删除
> delete from score where name="Hebe";
> select * from score;
+------+------+------+
| id   | name | math |
+------+------+------+
|    1 | Nana |   50 | 
+------+------+------+
> select * from addr;
+----+-------+---------+---------+
| id | aname | addr    | tel     |
+----+-------+---------+---------+
|  1 | Nana  | addr... | 6668787 | 
+----+-------+---------+---------+
 

推荐阅读
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文详细介绍了如何使用SQL*Plus连接Oracle数据库以及使用MySQL客户端连接MySQL数据库的方法,包括基本命令和具体操作步骤。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文通过一系列实验,探讨了Oracle 11g数据库中密码错误验证延迟特性对用户登录速度的影响。实验旨在验证当某个用户因输入错误密码而触发延迟时,是否会影响其他用户的正常登录速度。 ... [详细]
  • SQL查询与事务管理:深入解析
    本文详细介绍了SQL查询的基本结构和高级特性,包括选择、分组查询以及权限控制等内容,并探讨了事务管理中的并发控制策略,旨在为数据库管理员和开发人员提供实用指导。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
author-avatar
小艾的沙滩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有