防止用戶重複秒殺,基於這唯一性可以為我們過濾
success_killed 的 primary key
show tables;
show create table seckill\G => 可以看這表示如何創建的 (DDL)
=========
-- 数据库初始化脚本 -- 创建数据库 CREATE DATABASE seckill; -- 使用数据库 USE seckill; -- 创建秒杀库存表 CREATE TABLE seckill ( `seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id', `name` varchar(120) NOT NULL COMMENT '商品名称', `number` int NOT NULL COMMENT '库存数量', `start_time` timestamp NOT NULL COMMENT '秒杀开启时间', `end_time` timestamp NOT NULL COMMENT '秒杀结束时间', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (seckill_id), KEY idx_start_time (start_time), KEY idx_end_time (end_time), KEY idx_create_time (create_time) ) ENGINE = InnoDB AUTO_INCREMENT = 1000 DEFAULT CHARSET=utf8 COMMENT="秒杀库存表"; -- 初始化数据 INSERT INTO seckill (name, number, start_time, end_time) VALUES ('100元秒杀iPhone6', 100, '2020-03-28 00:00:00', '2020-03-29 00:00:00'), ('100元秒杀iPhone7', 200, '2020-03-28 00:00:00', '2020-03-29 00:00:00'), ('100元秒杀iPhone8', 300, '2020-03-28 00:00:00', '2020-03-29 00:00:00'), ('100元秒杀iPhoneX', 400, '2020-03-28 00:00:00', '2020-03-29 00:00:00'), ('100元秒杀iPhoneXS', 500, '2020-03-28 00:00:00', '2020-03-29 00:00:00'); -- 秒杀成功明细表 CREATE TABLE success_killed ( `seckill_id` bigint NOT NULL COMMENT '秒杀商品ID', `user_phone` bigint NOT NULL COMMENT '用户手机号', `state` tinyint NOT NULL DEFAULT -1 COMMENT '状态标志:-1:无效 0:成功 1:已付款', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (seckill_id, user_phone), KEY idx_create_time (create_time) ) ENGINE = InnoDB DEFAULT CHARSET=utf8 COMMENT='秒杀成功明细表'; -- 连接数据库控制台 mysql -uroot -p77777777 -- 为什么手写DDL -- 记录每次的上线DDL -- 上线V1.1 ALTER TABLE seckill; DROP INDEX idx_start_time; -- 上线V1.2 INSERT INTO seckill (name, number, start_time, end_time) VALUES ('100元秒杀ViVO', 100, '2020-03-31 00:00:00', '2020-04-01 00:00:00'), ('100元秒杀ViVO', 100, '2020-04-01 00:00:00', '2020-04-02 00:00:00'), ('100元秒杀OPPO', 200, '2020-04-02 00:00:00', '2020-04-03 00:00:00');
秒杀成功明细表
用户登录认证相关的信息
create table success_killed(
'seckill_id' bitint not null comment '秒杀商品id',
'user_phone' bitint not null comment '用户手机号',
'state' tinyint not null default -1 comment '状态标示:-1无效,0:成功 1:已付款',
'create_time' timestamp not null comment '创建时间',
PRIMARY KEY(seckill_id,user_phone),/*联合主键*/
key idx_create_time(create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8 COMMENT='秒杀成功明细表';
1、创建秒杀数据库 seckill(InnoDB ).
create table seckill(
'seckill_id' bigint not null AUTO_INCREMENT COMMENT '商品库存id',
'name' varchar(120) not null comment '商品名称',
'number' int NOT NULL comment '库存数量',
'start_time' timestamp not null comment '秒杀开始时间',
'end_time' timestamp not null comment '秒杀结束时间',
'create_time' timestamp not null default CURRENT_TIMESTAMP comment '创建时间',
PRIMARY KEY (seckill_id),
key idx_start_time(start_time),
key idx_end_time(end_time),
key idx_create_time(create_time)
) ENGINE= InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf-8 COMMENT='秒杀库存表'
2、
state(创建数据库)范围很小用tinyint
初始的自增id设为1000
AUTO_INCREMENT=1000
MySql有多重存储引擎供我们使用,但是可以支持事务的存储引擎只有InnoDB
Java web工程
Main->sql->schema.sql
手写代码创建数据库
Crete DATABASE seckill;
Use seckill;
Create table seckill (
)ENGINE=InnoDB
支持事务的引擎只有InnoDB
手写建表ddl
数据库设计结构
支持事物的表,只有InnoDB
解决方案,set names gbk;
CREATE TABLE seckill(
seckill_id bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
name varchar(120) NOT NULL COMMENT '库存数量',
start_time timestamp NOT NULL COMMENT '秒杀开启时间',
end_time timestamp NOT NULL COMMENT '秒杀结束时间',
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (seckill_id),
key idx_start_time(start_time),
key idx_end_time(end_time),
key idx_create_time(create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='秒杀库存表';
默认字符是utf8,而不是utf-8
show table
show create table xxxxxx\G
验证