文章目录
- 1. 数据表的一些定义
- 2. 创建数据库
- 3. 建表
- 4. 完整性约束条件
- 4.1 有哪些完整性约束条件
- 4.2 PRIMARY KEY
- 4.3 复合主键
- 4.4 NOT NULL
- 4.5 DEFAULT
- 4.6 UNIQUE KEY
- 6. 下一节我们将学习数据表结构的相关操作
1. 数据表的一些定义
– 数据表由行列组成row and column
– 每个数据表至少有一列,有零行或多行组成
– 表名唯一。不包含特殊字符
2. 创建数据库
-- 首先,我们先创建一个数据库
DROP DATABASE test2;
CREATE DATABASE IF NOT EXISTS test2 DEFAULT CHARACTER SET UTF8;
-- 然后我们选择使用这个数据库
USE test2;
3. 建表
-- 创建一个用户表
CREATE TABLE IF NOT EXISTS test2_user(
id INT COMMENT '用户id',
username VARCHAR(20) COMMENT '用户名',
password CHAR(10),
email VARCHAR(50),
age TINYINT,
tel CHAR(11),
card CHAR(18),
salary FLOAT(8,2),
address VARCHAR(100),
sex ENUM('男','女','保密'),
createtime TIMESTAMP
)ENGINE=INNODB CHARSET=UTF8;
-- 查看当前数据库下的数据表
SHOW TABLES;
-- 查看某数据库下的数据表
SHOW TABLES FROM test2;
SHOW TABLES IN test2;
-- 查看指定数据表详细信息
SHOW CREATE TABLE test2_user;
-- 查看表结构
DESC test2_user;
SHOW COLUMNS FROM test2_user;
-- 删除数据表
DROP TABLE IF EXISTS test2_user;
-- 插入数据(NOW()和CURRENT_TIME都是表示当前时间)
INSERT INTO test2_user(id,username,password,email,age,tel,card,salary,address,sex,createtime) VALUES(1,'name1','password1','email1',1,'11111111111','111111111111111111',11.11,'1号大院','男',NOW());
-- 查询所有记录
SELECT * FROM test2_user;
4. 完整性约束条件
4.1 有哪些完整性约束条件
UNSIGNED
无符号,没有负数,从0开始
ZEROFILL
零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加
NOT NULL
非空约束,也就是插入值的时候这个字段必须要给值,值不能为空
DEFAULT
默认值,如果插入记录的时候没有给字段赋值,则使用默认值
PRIMARY KEY
主键,标识记录的唯一性,值不能重复,一个表只能有一个主键,自动禁止为空
AUTO_INCREMENT
自动增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1
UNIQUE KEY
唯一性,一个表中可以有多个字段是唯一索引,同样的值不能重复,但是NULL值除外
FOREIGN KEY(后面学习数据库增删改查时会具体讲解)
外键约束
我们接下来会学习一些常用的完整性约束条件,其余几个简单的大家自己尝试着摸索
4.2 PRIMARY KEY
– 创建主键,一个表只有一种主键,主键唯一且不为空,不自增长,需要手动auto_increment。 AUTO_INCREMENT是根据数据表中的最大主键值来增长,一般配合主键使用,可指定初始大小。
USE test2;
DROP TABLE IF EXISTS test01;
CREATE TABLE test01(
id INT PRIMARY KEY AUTO_INCREMENT,
num INT,
username CHAR(8)
-- PRIMARY KEY(id)
)ENGINE=INNODB CHARACTER SET=UTF8; -- 可在此设置 AUTO_INCREMENT=指定值初始值
INSERT test01(id,num,username) VALUE(1,1,'小明'); -- 正确
INSERT test01(id,num,username) VALUE(1,2,'小红'); -- 错误,主键唯一
4.3 复合主键
– 复合主键,组合值不相同即可
USE test2;
DROP TABLE IF EXISTS test01;
CREATE TABLE test01(
id INT UNSIGNED,
num INT UNSIGNED,
username CHAR(8),
PRIMARY KEY(id,num)
)ENGINE=INNODB CHARACTER SET=UTF8;
INSERT test01(id,num,username) VALUE(1,1,'小明');
INSERT test01(id,num,username) VALUE(1,2,'小红'); -- 正确
4.4 NOT NULL
– NOT NULL,插入值不允许为NULL,但是可以是空值,即’’.注意上述情况只能是字符类型才适用,数值型不适用
USE test2;
DROP TABLE IF EXISTS test01;
CREATE TABLE test01(
id INT,
num CHAR NOT NULL,
username CHAR(8)
)ENGINE=INNODB CHARACTER SET=UTF8;
INSERT test01(id,num,username) VALUE(1,'','小明'); -- 正确
INSERT test01(id,num,username) VALUE(NULL,'1','小红'); -- 正确
INSERT test01(num,username) VALUE('2','小丁'); -- 正确
INSERT test01(id,username) VALUE(4,'小丁'); -- 错误,报错> 1364 - Field 'num' doesn't have a default value。
此时应该怎么办???我们接下来用default来解决赋默认值
4.5 DEFAULT
USE test2;
DROP TABLE IF EXISTS test01;
CREATE TABLE test01(
id INT,
num CHAR(8) NOT NULL DEFAULT '默认值',
username CHAR(8)
)ENGINE=INNODB CHARACTER SET=UTF8;
INSERT test01(id,username) VALUE(4,'小丁'); -- 正确
INSERT test01(id,num,username) VALUE(4,'123456789','小丁'); -- 错误,不管是中文还是数字,只要超过8个就报错
INSERT test01(id,num,username) VALUE(4,'你你你你你你你你','小丁'); -- 正确
4.6 UNIQUE KEY
– UNIQUE KEY唯一索引,唯一索引不能相同,但是NULL值可以有多个。一个表中可以有多个唯一索引,如身份证号,电话等字段可以为唯一索引。
USE test2;
DROP TABLE IF EXISTS test01;
CREATE TABLE test01(
id INT PRIMARY KEY AUTO_INCREMENT,
card CHAR(18) UNIQUE KEY,
TEL CHAR(11) UNIQUE KEY
)ENGINE=INNODB CHARACTER SET=UTF8;
INSERT test01(card,tel) VALUE('123456789123456789','12345678912'); -- 正确
INSERT test01(card,tel) VALUE('123456789123456789','12345678912'); -- 错误,唯一索引不相同。此时数据未插入,但是auto_increment却已经自增
INSERT test01(card,tel) VALUE('','12345678913'); -- 正确
INSERT test01(card,tel) VALUE('','12345678914'); -- 错误,空字符串和NULL是不一样的概念.此时数据未插入,但是auto_increment却已经自增
INSERT test01(card,tel) VALUE(NULL,'12345678914'); -- 正确
INSERT test01(card,tel) VALUE(NULL,'12345678915'); -- 正确
**上面出现了一个问题,为什么我们的数据未插入成功,但是auto_increment却已经自增?博主猜测是auto_increment和插入事务是前后分离的,即数据库先执行auto_increment然后再执行插入事务,事务执行失败则rollback,但是auto_increment却已经执行完成了。不知道说的对不对,大家可以帮忙纠正错误