数据类型
数据库类型是方言,不同的数据库类型的名字可能不一致.
数字类型
整数类型
INT(m)
BIGINT(m)
注:m表达长度
INT(5):整数最大5位,如果插入的数据不足5位时,前面会自动补0.例如:18实际保存时00018
浮点数类型
DOUBLE(m,n)
m表单数字的位数(包含整数与小数位数)
n表达其中小数的位数
money DOUBLE(7,2)
money字段总共有7位数字,其中有2位小数.整数为5位.
money最大可以保存的数字:99999.99
如果指定的数字精度大于可以保存的精度时会进行四舍五入
INSERT INTO person (money) VALUES (1234.867)
^7会进行四舍五入 实际插入后,这条记录的money字段值为1234.87
如果指定的数字已经达到可保存的最大值并且精度仍然超过且需要四舍五入会报错
INSERT INTO person (money) VALUES (99999.996)
当四舍五入后的数字超过了money可以保存的最大值则会报错
字符类型
定长字符:CHAR(n)
n表示长度,单位是字符
n的最大值为255,CHAR类型最多可以保存255个字符
定长字符串,每条记录该字段的值在磁盘上创建的空间是固定的,无论实际保存的数据是多大,总是会占用指定长度的空间.不足的部分会补充空格.
name CHAR(10):name字段最多可以保存10个字符, 如果实际保存数据时:‘张三’,后面会补充8个空格占够空间
优点:占用的磁盘空间是固定的,因此查询速度快.
缺点:磁盘空间占用是固定的,因此会出现浪费.
变长字符
VARCHAR(n)
n表示长度,单位是字节
n的最大值为65535
实际占用磁盘空间取决于保存的数据
name VARCHAR(30):
name保存的字符串最多占30个字节.以UTF-8编码为例,如果保存’张三’,实际仅占用6个字节.
优点:不会造成磁盘的浪费
缺点:每条记录占用的磁盘空间不定,因此查询稍慢
TEXT(n)
n表示长度,单位是字符
n的最大值为65535
日期类型
- DATE:保存年月日
- TIME:保存时分秒
- DATETIME:保存年月日时分秒
- TIMESTAMP:时间戳,保存UTC(世界调整时)时间.记录自1970年元旦到表达的时间所经过的毫秒
插入日期类型数据时,如果字段为DATETIME类型,我们可以使用字符串来表达日期,但是格式必须为"yyyy-MM-dd hh:mm:ss"
注:MM为2位数字的月 mm为两位数字的分插入日期类型时,如果字段为DATETIME**,字符串指定日期内容可以忽略时分秒**
插入日期类型时,如果字段为DATETIME**,字符串指定日期时不能忽略年月日**
插入DOUBLE类型数据时,精度超出部分会进行四舍五入,但是整数部分超过则会直接报错
约束条件
我们为我们的表添加某些特定的约束条件,这样一来可以限制对表的相关操作.只有满足相应约束条件的操作才可以进行,否则会被数据库拒绝.
主键约束(PRIMARY KEY)
- 主键约束每张表只能有一个
- 主键约束的特点:该字段的值在整张表中每条记录都是非空且唯一的
- 一般情况下一张表的第一个字段会被施加主键约束,一般名字用"id"
主键字段不能插入重复的值
不能将NULL值插入到主键字段
忽略主键字段时,如果主键字段没有默认值也会将NULL值插入,这是也会报错.
修改表记录时,也不能将NULL或重复的值修改到主键字段上
自增
具有主键约束的字段会添加自增,让数据库自行维护该字段的值AUTO_INCREMENT
创建表时为主键字段添加自增
CREATE TABLE user2(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30), age INT(3) )
修改表时为字段添加自增
修改user1表中的id字段,为其添加主键约束与自增
ALTER TABLE user1 CHANGE id id INT
PRIMARY KEY AUTO_INCREMENT;
如果表中字段已经具有了主键约束,则可以单独添加自增
ALTER TABLE user1
CHANGE id id INT AUTO_INCREMENT;
当主键字段具有自增后,插入数据时可以忽略主键字段
INSERT INTO user2 (name,age) VALUES (‘张三’,22);
INSERT INTO user2 (name,age) VALUES (‘李四’,33);
当字段具有自增时,显示的插入NULL值是无效的,该字段仍然会自增(不推荐)
非空约束(NOT NULL)
被非空约束修饰的字段,表中每条记录该字段的值都不允许为NULL
例
创建表是指定非空约束
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL, 为name字段添加非空约束 age INT(3)
)
修改表时,为某字段指定非空约束
ALTER TABLE user2
CHANGE name name VARCHAR(30) NOT NULL
非空约束可以在查看表结构时体现出来
DESC user3;
不能将NULL值插入到具有非空约束的字段上
INSERT INTO user3 (name,age) VALUES (NULL,22);
不能显示的将NULL值插入
插入数据时,不能忽略具有非空约束的字段
INSERT INTO user3 (age) VALUES (22);
name没有默认值,不能为NULL
修改表中记录时,也不能将NULL值修改到具有非空约束的字段上
如果user2的name字段具有非空约束:
UPDATE user2
SET name=NULL WHERE id=1
唯一性约束(UNIQUE)
具有唯一性约束的字段在整张表中每条记录中该字段的值都不允许重复
唯一性约束允许NULL值,并且每条记录都可以为NULL.
例
创建表时为字段指定唯一性约束
CREATE TABLE user4(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) UNIQUE,
age INT(3)
)
修改表时可以为字段添加唯一性约束
注意:如果name字段有非空约束,此时修改该字段添加唯一性约束时会取消掉它的非空约束
ALTER TABLE user3 CHANGE name name VARCHAR(30) UNIQUE;
如果不想取消非空约束,需要同时指定
ALTER TABLE user3
CHANGE name name VARCHAR(30) NOT NULL UNIQUE;
插入数据是不能将重复的值插入到具有唯一性约束的字段中
NULL值可以被插入到具有唯一性约束的字段中,且可以多次
修改记录时也不能将重复的值修改到该字段中,NULL除外
外键约束
外键约束是配合主键字段进行多表关联关系中使用的约束.
- 具有外键约束的字段的值只能是其关联的主键字段中含有的值或NULL
-删除主键字段记录时,除非该条记录主键字段的值在外键字段中没有对应,否则无法删除
实际开发中外键约束会无形中增加多次不必要的DML操作才能保证数据完整性,这对项目来说是不要的操作,会带来额外的开销和对应的逻辑代码维护.
结论:实际开发中几乎不会添加外键约束.