mysql使用navicat设计类型及长度及外键的注意事项Incorrect datetime value: ‘‘ for column ‘createTime‘ at row 1

mysql字段设计时

1 char、varchar都可以指定最大的字符长度,但text不可以.
2 数据的检索效率是:char > varchar > text
char:
CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充)
varchar:
varchar(5):字段只允许最多5个字符或者5个汉字,只表示个数,不是表示字节,字符空间,但可算出字节=5*3=15个字节(utf8编码下,下面有讲到)。
存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
text:
存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值
tinyint:
范围:-128-127(-2⁷-1~2⁷-1),与int(m)一样,m不起作用。
int:
int(1)、int(4)、int(11)和int(110)表示意思是一样的。括号里的值不同没有任何区别 范围:-2³¹-1~2³¹-1 (负21亿到正21亿)-2147483648-2147483647
float:
float(7,3):字段总允许宽度为7,其中整数部分为4位(数值范围可在0-9999),小数部分为3位(数值范围可在0-999)不可再次手动在navicat中此字段所在数据行的所有字段值也不可手动删除这条记录,但可通过sql修改
double:
double(7,3):字段总允许总长度为7,其中整数部分为4位(数值范围可在0-9999),小数部分为3位(数值范围可在0-999)
可手动在navicat中改此字段及同数据行其他字段的值,也可通过sql修改。
date: 日期
time: 时间
timestamp: 日期 时间

上面三个时间都是在java.sql包下的。都是java.util.Date的子类。
Timestamp.valueof(str)
simpledateformat
对字符时间和相应类型进行转换。

向数据库插入时间时出现异常:Incorrect datetime value: ‘’ for column ‘createTime’ at row 1

在这里插入图片描述

把当前时间转成timestamp类型 插入到数据库中。其中数据库中为datetime类型。


//可以这样去解决
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date());
user.setCreatetime(Timestamp.valueOf(format));
new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")---定义好时间的格式。
注意,JDBC接口中用java.sql.Date类型的时间。
其它层如UI层,service业务层用java.util.Date类型的时间。
利用多态,表面上要一个util.Date,实际传一个它的子类sql.Date.
因此往往要进行转换java.sql.Date date = new java.sql.Date(new Date().getTime());

在这里插入图片描述

#表t_users中dd字段可以设计为int 或者tinyint,如果赋值true自动转为1,如果赋值false自动转为0
update t_users set dd=false where id=3 

在这里插入图片描述

结论:
1、经常变化的字段用varchar;

2、知道固定长度的用char;

3、超过255字节的只能用varchar或者text;

4、能用varchar的地方不用text;

5、能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;

6、同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表,原因请考 优化InnoDB表BLOB,TEXT列的存储效率

关于存储空间:

在使用UTF8字符集的时候,MySQL手册上是这样描述的:

基本拉丁字母、数字和标点符号使用一个字节;
大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
韩语、中文和日本象形文字使用三个字节序列。

即 一个汉字占多少长度与编码有关:
utf8/utf8mb4:一个汉字 = 3个字节,英文是一个字节
gbk: 一个汉字 = 2个字节,英文是一个字节

因此navicat设计字段的长度 是指个数,而不是所占字节空间数。

如何查出字节数:

select length(str)
MySQL检查长度,可用SQL语言 SELECT LENGTH(fieldname) FROM tablename 这个命令可以看到各行使用的字节数。

#创建专业表
CREATE TABLE Speciality(
	id INT PRIMARY KEY AUTO_INCREMENT,
	SpecialName VARCHAR(20) UNIQUE NOT NULL
)CHARSET=utf8;

#创建课程表(课程表的SpecialId 引用专业表的 id)
CREATE TABLE subject(
	subjectId INT PRIMARY KEY AUTO_INCREMENT,
  subjectName VARCHAR(20) UNIQUE NOT NULL,
  subjectHours INT DEFAULT 20,
  specialId INT NOT NULL,
  CONSTRAINT fk_subject_specialId  FOREIGN KEY(specialId) REFERENCES Speciality(id)  #引用专业表里的 id 作为外键,新增课程信息时,约束课程所属的专业。
)charset=utf8;

先删从表 ,再删主表

SELECT * from t_employees e INNER JOIN t_departments d ON e.DEPARTMENT_ID=d.DEPARTMENT_ID;
SELECT * from t_employees e,t_departments d where e.DEPARTMENT_ID=d.DEPARTMENT_ID;

在这里插入图片描述

由于外键效率低,很少去使用它,真实会使用逻辑去关联。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值