mysql约束类型 A P_mysql笔记: 数据类型、约束、范式
登陆mysql
# mysql -uroot -p123456
# 显示数据库
SHOW DATABASES;
# 创建数据库
CREATE DATABASE test;
# 显示数据库中的表
SHOW TABLES;
# 创建pet表
CREATE TABLE pets (
name VARCHAR(20),
owner VARCHAR(20),
species VARCHAR(20),
sex CHAR(1),
birth DATE,
death DATE
) character set = utf8;
# 显示表结构
DESC pets;
# 插入数据
INSERT INTO pets VALUES ('旺财2', '周星驰2', 'a', 'a', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财3', '周星驰3', 'b', 'b', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财4', '周星驰4', 'c', 'c', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财5', '周星驰5', 'd', 'd', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财6', '周星驰6', 'e', 'e', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财7', '周星驰7', 'f', 'f', '1990-01-01', NULL);
INSERT INTO pets VALUES ('旺财8', '周星驰8', 'g', 'g', '1990-01-01', NULL);
# 查询
SELECT * FROM pets;
# 删除数据
DELETE FROM pets WHERE name='旺财2';
# 修改数据
UPDATE pets SET name='旺旺财' WHERE owner='周星星';
常用数据类型
# 数值
# TINYINT 1 字节 小整数值
# # SMALLINT 2 字节 大整数值
# MEDIUMINT 3 字节 大整数值
# INT或INTEGER 4 字节 大整数值
# BIGINT 8 字节 极大整数值
# FLOAT 4 字节 单精度
# DOUBLE 8 字节 双精度
# DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2
# 日期/时间
# DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
# TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
# YEAR 1 1901/2155 YYYY 年份值
# DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
# TIMESTAMP 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒
# 北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07
# YYYYMMDD HHMMSS 混合日期和时间值,时间戳
# 字符串
# CHAR 0-255字节 定长字符串
# VARCHAR 0-65535 字节 变长字符串
# TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
# TINYTEXT 0-255字节 短文本字符串
# BLOB 0-65 535字节 二进制形式的长文本数据
# TEXT 0-65 535字节 长文本数据
# MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
# MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
# LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
# LONGTEXT 0-4 294 967 295字节 极大文本数据
mysql建立表约束
# 主键约束
CREATE table user (
id int primary key,
name varchar(20)
) character set = utf8;
INSERT INTO user values(1, '张三');
# 联合主键
# id和name在一起不重复就行
CREATE table user2 (
id int,
name varchar(20),
password varchar(20),
primary key (id, name)
) character set = utf8;
INSERT into user2 values (1, '张三', '123');
INSERT into user2 values (2, '张三', '123');
INSERT into user2 values (1, '李四', '123');
# id 和 name与第一项相同
INSERT into user2 values (1, '张三', '123');
# 联合组件任何一项都不能为NULL
INSERT into user2 values (NULL, '张三', '123');
# 自增约束
CREATE table user3 (
id int primary key auto_increment,
name varchar(20)
) character set = utf8;
INSERT INTO user3 (name) values ('张三'); # 连续执行三次
# 忘记创建组件约束的情况
CREATE table user4 (
id int,
name varchar(20)
) character set = utf8;
ALTER table user4 add primary key auto_increment(id); # 补充添加自增主键约束
ALTER table user4 drop primary key; # 删除主键约束
ALTER table user4 modify id int primary key auto_increment; # 修改某一个字段为自增主键
desc user4;
# 唯一约束
# 约束该字段的值不能重复
CREATE table user5 (
id int,
name varchar(20)
) character set = utf8;
alter table user5 add unique(name);
INSERT into user5 (name) values ('张三'); # 连续执行两次
CREATE table user6 (
id int,
name varchar(20),
unique(name)
) character set = utf8;
CREATE table user7 (
id int,
name varchar(20) unique
) character set = utf8;
# 联合唯一约束
CREATE table user8 (
id int,
name varchar(20),
unique(id, name)
) character set = utf8;
# 删除唯一约束
alter table user7 drop index name;
# 添加唯一约束
alter table user7 modify name varchar(20) unique;
# 非空约束
CREATE table user9 (
id int,
name varchar(20) not null
) character set = utf8;
# 默认约束
# 当我们插入字段的时候,如果没有传值,就会用默认约束
CREATE table user10 (
id int,
name varchar(20) not null,
age int default 10
) character set = utf8;
# 外键约束
# 涉及到两个表:父表、子表
CREATE table classes(
id int primary key,
name varchar(20)
) character set = utf8;
CREATE table students(
id int primary key,
name varchar(20),
class_id int,
foreign key(class_id) references classes(id)
) character set = utf8;
INSERT INTO classes values (1, '一班');
INSERT INTO classes values (2, '二班');
INSERT INTO classes values (3, '三班');
INSERT INTO classes values (4, '四班');
INSERT INTO students values (1001, '张三', 1);
INSERT INTO students values (1002, '李四', 2);
INSERT INTO students values (1003, '王五', 3);
INSERT INTO students values (1004, '赵六', 4);
# id 为5的班级不存在,所以报错
INSERT INTO students values (1005, '钱七', 5);
# 不能删除父表中的数据,因为这个数据子表要关联
DELETE FROM classes WHERE id = 4;
数据库的三大设计范式
# 1NF: 数据表中的所有字段都是不可分割的原子值?
CREATE table student2 (
id int primary key,
name varchar(20),
address varchar(30)
) character set = utf8;
INSERT INTO student2 VALUES(1, '张三', '中国辽宁省沈阳市高新区...');
INSERT INTO student2 VALUES(2, '李四', '中国吉林省长春市高新区...');
INSERT INTO student2 VALUES(3, '王五', '中国黑龙江省哈尔滨市高新区...');
# 中国辽宁省沈阳高新区... 这个字段值是可以继续拆分的:中国=>辽宁省=>沈阳市=>高新区...
# 修改后
CREATE table student3 (
id int primary key,
name varchar(20),
country varchar(20),
province varchar(20),
city varchar(20),
detail varchar(60)
) character set = utf8;
INSERT INTO student3 VALUES(1, '张三', '中国', '辽宁省', '沈阳市', '高新区...');
INSERT INTO student3 VALUES(2, '李四', '中国', '吉林省', '长春市',' 高新区...');
INSERT INTO student3 VALUES(3, '王五', '中国', '黑龙江省', '哈尔滨市', '高新区...');
# 设计的越详细,对于某些实际操作可能越好,但是不一定都是好处
# 具体要根据项目的需求而定
# 2NF:必须满足1NF的前提下,除主键外的第一列都必须满足依赖与主键。
# 如果要出现不完全依赖,只可能发生在联合主键的情况下。
CREATE TABLE orders(
product_id int,
customer_id int,
product_name varchar(20),
customer_name varchar(20),
primary key(product_id, customer_id)
) character set = utf8;
# 问题?
# 除主键以外的其他列,只依赖与主键的部分字段。
# 所以上面的例子需要拆表:
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int
) character set = utf8;
CREATE TABLE product(
id int primary key,
name varchar(20)
) character set = utf8;
CREATE TABLE customer(
id int primary key,
name varchar(20)
) character set = utf8;
# 分成三个表之后,就满足第二范式
# 3NF:必须满足2NF,除主键列的其他列之间不能有传递依赖关系。
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int,
customer_phone varchar(15)
) character set = utf8;
# 修改为:
CREATE TABLE orders(
order_id int primary key,
product_id int,
customer_id int
) character set = utf8;
CREATE TABLE customer(
id int primary key,
name varchar(20),
phone varchar(15)
) character set = utf8;
# 总结:
# 也就是在每列不能拆分的情况下(1NF),
# 其他列必须依赖主键的全部(2NF),
# 且只依赖于主键的全部(3NF)
mysql约束类型 A P_mysql笔记: 数据类型、约束、范式相关推荐
- mysql time类型解析_mysql时间数据类型解析
1.MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比 ...
- Mysql数据库---约束类型_mysql数据库的数据类型及约束
1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) ...
- mysql 体重 类型 身高_MySQL常用数据类型
上篇文章我们讲到MySQL的常用命令,那么这篇文章我们分享一下MySQL数据库常用的数据类型有哪些,生产环境下我们在建表的时候,我们都是需要根据数据的类型去创建我们的表字段的,那么表字段的类型在我们数 ...
- mysql各类型长度_mysql 各数据类型的大小及长度
Android RecyclerView 的简单使用 Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, R ...
- Mysql数据库---约束类型
Mysql数据库的约束类型有:主键约束(Primary Key),外键约束(Foreign Key),非空约束(Not Null),唯一性约束(Unique),默认约束(Default). 一.主键约 ...
- oracle常用的约束条件类型,oracle数据库的5种约束类型
oracle 数据库 数据表的5个约束类型: 1.主键约束 2.外键约束 3.唯一约束 4.检查约束 5.非空约束 F 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个 ...
- mysql 将字符串转换数字类型的_MySQL 字符串类型用数字可以查出来 MySQL字符串类型会转换成数字 MySQL隐式类型转换...
一.发现问题 1.在一次MySQL查询中,某字段为 varchar 字符串类型,传入参数值为 int 数字类型,发现查询的结果和预期的不一致. 如: 某两列 name='11' , name = '1 ...
- MySQL 约束类型
# MySQL 约束类型 约束实际上就是表中数据的限制条件,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.比如name字段中要让其用户名不重复,这就需要添加约束.或者必须注册的时候 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·003【表的约束、表的CRUD操作(DDL语句)】
文章目录 一.表的约束 1.约束类型 2.添加约束 二.表的CRUD操作(DDL语句) 1.C(Create):创建 2.R(Retrieve):查询 3.U(Update):更新 4.D(Delet ...
最新文章
- [收集] C++ memset ,memcpy 和strcpy 的区别
- 小波变换理解:消失矩、支撑长度的理解
- C语言实现字符串匹配的Rabin-Karp算法(附完整源码)
- Cloudstack安装(二)
- postgresql interval 字段拼接
- mysql实现主从复制的方式_mysql实现主从复制、读写分离的配置方法(二)
- 九度 1532:棋盘寻宝扩展(背包方案统计)
- HSF框架日常问题记录1
- SAN(存储区域网络),WWN, WWPN,WWNN区别
- 【解决】如何将腾讯QLV格式的视频转换成MP4
- 会议记录管理系统(6) - 查找会议记录模块设计
- 编译go文件时内部包引用受限的问题(use of internal package /PATH/ not allowed)
- mysql表文件与结构_MySQL文件结构、逻辑架构及sql执行流程分析
- 关于python机器学习cross_val_score()交叉检验的参数cv实际默认为5这件事,你怎么看?
- java大数据量调优(超赞值得收藏)
- 【数学基础】KKT条件
- android onCreate与onCreateView的区别
- 基于WebSocket实现网页聊天室
- zlib minizip 压缩与解压缩
- 记一次 .NET 某电子病历 CPU 爆高分析