黑马SSM项目使用mysql建表


写在前面

  • 此篇文章是用于黑马旅游网后台管理系统的相关数据库表,由mysql建立。
  • 注意:下面sql语句中创建触发器的语句中 "//"不是注释,是必须的!!要不然会语法出错。
  • 在项目运行过程中,遇到了一个问题,当我对数据库进行插入数据时,会抛出异常,显示“id列不应为空”,详情如下:
    1. 原先错误的代码:
      CREATE TABLE `product` (
        `id` VARCHAR(36) NOT NULL,
        `productNum` VARCHAR(50) NOT NULL,
        `productName` VARCHAR(50) DEFAULT NULL,
        `cityName` VARCHAR(50) DEFAULT NULL,
        `DepartureTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        `productPrice` DOUBLE DEFAULT NULL,
        `productDesc` VARCHAR(500) DEFAULT NULL,
        `productStatus` INT(11) DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `product` (`id`,`productNum`)
      ) ENGINE=INNODB DEFAULT CHARSET=utf8;
      
      /*删除触发器*/
      DROP TRIGGER IF EXISTS `product_before_insert`;
      
      DELIMITER //
      CREATE TRIGGER `product_before_insert` 
      BEFORE INSERT ON `product` FOR EACH ROW 
      BEGIN 
      IF new.id IS NULL THEN 
      SET new.id = UUID();
      END IF;
      END;
      //
      
      
    2. 究其原因: 我们可以从上面看到,在设置主键id时我们设置成非空,而当设置触发器时,我们的判断条件是如果主键为空,则将主键设置为uuid。那么问题来了,我在插入数据的时候语句如下:
      INSERT INTO PRODUCT (productnum, productname, cityname, departuretime, 	productprice, productdesc, productstatus) 
      VALUES ('itcast-002', '北京三日游', '北京', NOW(), 1200, '不错的旅行', 1); 
      
      插入的语句中,id值为空,数据库立马会报错,那你会说,那我给id设置一个不就好了,可是!!!使用uuid就是为了让系统生成一个唯一的机器识别码,你自己写一个那我直接用auto_increment来自增不就好了吗。
    3. 解决办法: 这里有两种,第一种方法,将其他列替换主键列作为触发器判断的标准,成功执行了,下面的代码用的就是这种方法;第二种方法,在建表时把主键列设置一个默认值,然后用触发器对其进行判断,如果不为空则使用uuid进行插入,也能成功解决,当然,此处还可进行进一步优化,既然设置了主键的默认值,那么判断条件可以精确到完全匹配默认值,这样避免把非空作为判断的话可能的意外bug。

壹 | product表

SELECT * FROM product

DROP TABLE IF EXISTS `product`;

CREATE TABLE `product` (
  `id` VARCHAR(36) NOT NULL,
  `productNum` VARCHAR(50) NOT NULL,
  `productName` VARCHAR(50) DEFAULT NULL,
  `cityName` VARCHAR(50) DEFAULT NULL,
  `DepartureTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `productPrice` DOUBLE DEFAULT NULL,
  `productDesc` VARCHAR(500) DEFAULT NULL,
  `productStatus` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `product` (`id`,`productNum`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

/*删除触发器*/
DROP TRIGGER IF EXISTS `product_before_insert`;

DELIMITER //
CREATE TRIGGER `product_before_insert` 
BEFORE INSERT ON `product` FOR EACH ROW 
BEGIN 
IF new.productDesc IS NOT NULL THEN 
SET new.id = UUID();
END IF;
END;
//

INSERT INTO PRODUCT (productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) 
VALUES ('itcast-002', '北京三日游', '北京', NOW(), 1200, '不错的旅行', 1); 

INSERT INTO PRODUCT (productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) 
VALUES ('itcast-003', '上海五日游', '上海', NOW(), 1800, '魔都我来了', 0); 

INSERT INTO PRODUCT (productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) 
VALUES ('itcast-001', '北京三日游', '北京', NOW(), 1200, '不错的旅行', 1);

贰 | traveller表

SELECT * FROM `traveller`;
	
CREATE TABLE traveller( 
	id VARCHAR(32) PRIMARY KEY, 
	NAME VARCHAR(20), 
	sex VARCHAR(20), 
	phoneNum VARCHAR(20), 
	credentialsType INT, 
	credentialsNum VARCHAR(50), 
	travellerType INT 
	)
	
/*删除触发器*/
DROP TRIGGER IF EXISTS `traveller_before_insert`;

DELIMITER //
CREATE TRIGGER `traveller_before_insert` 
BEFORE INSERT ON `traveller` FOR EACH ROW 
BEGIN 
IF new.credentialsNum IS NOT NULL THEN 
SET new.id = UUID();
END IF;
END;
//
	
INSERT INTO TRAVELLER (NAME, sex, phonenum, credentialstype, credentialsnum, travellertype) 
VALUES ('张龙', '男', '13333333333', 0, '123456789009876543', 0); 

INSERT INTO TRAVELLER (NAME, sex, phonenum, credentialstype, credentialsnum, travellertype) 
VALUES ('张小龙', '男', '15555555555', 0, '987654321123456789', 1);	

叁 | member表

SELECT * FROM `member`;
CREATE TABLE member( 
	id VARCHAR(32) PRIMARY KEY, 
	NAME VARCHAR(20), 
	nickname VARCHAR(20), 
	phoneNum VARCHAR(20), 
	email VARCHAR(20) 
	)

/*删除触发器*/
DROP TRIGGER IF EXISTS `member_before_insert`;

DELIMITER //
CREATE TRIGGER `member_before_insert` 
BEFORE INSERT ON `member` FOR EACH ROW 
BEGIN 
IF new.phoneNum IS NOT NULL THEN 
SET new.id = UUID();
END IF;
END;
//

INSERT INTO MEMBER (NAME, nickname, phonenum, email) 
VALUES ('张三', '小三', '18888888888', 'zs@163.com');

肆 | orders表

DROP TABLE IF EXISTS `orders`;

SELECT * FROM `orders`;

CREATE TABLE orders( 
	id VARCHAR(32) PRIMARY KEY, 
	orderNum VARCHAR(20) NOT NULL UNIQUE, 
	orderTime TIMESTAMP, 
	peopleCount INT, 
	orderDesc VARCHAR(500), 
	payType INT, 
	orderStatus INT, 
	productId VARCHAR(32), 
	memberId VARCHAR(32), 
	FOREIGN KEY (productId) REFERENCES product(id), 
	FOREIGN KEY (memberId) REFERENCES member(id) 
	)
	
/*删除触发器*/
DROP TRIGGER IF EXISTS `orders_before_insert`;

DELIMITER //
CREATE TRIGGER `orders_before_insert` 
BEFORE INSERT ON `orders` FOR EACH ROW 
BEGIN 
IF new.orderDesc IS NOT NULL THEN 
SET new.id = UUID();
END IF;
END;
//

INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
VALUES ('12345', NOW(), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); 

INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
VALUES ('54321', NOW(), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); 

INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
VALUES ('67890', NOW(), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 

INSERT INTO ORDERS (ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) 
VALUES ('98765', NOW(), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); 


完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[ 2021年,将Spring全家桶的课程进行Review,确保不再有顺序错乱等问题导致学员看不懂内容,进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并开始逐步增加高阶的Spring Security等内容,课件将逐步进行上传,敬请期待! ]本课程是Spring全家桶案例精讲课程的第二部分Spring MVC,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Java Spring的Web知识点,主要是关于Spring MVC的应用,包含:表单的增删改查、国际化、过滤器、拦截器、日志Log4j2及slf4j的使用、主题更改网站皮肤及样式、文件上传等的案例讲解,并且最后以一个SSM(Spring+Spring MVC+Mybatis)贯穿前后台的案例作为Spring MVC课程的终奖, 从而使大家快速掌握Spring的基础核心知识,快速上手,为面试、工作等做好充足准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验 【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值