一.创建/删除数据库.

 create database t14;
drop database t14;
use t14;

二.创建若干表用于测试

这里预留了几个坑,下面要填坑的..

 /*创建学生表*/
create table student(
studentNo int() PRIMARY KEY not null,
loginPwd VARCHAR() not null,
studentName VARCHAR() not NULL,
sex char() not null DEFAULT '男',
gradeID int() UNSIGNED,
phone VARCHAR(),
address VARCHAR() default '地址不详',
bornDate DATETIME,
email VARCHAR(),
identifyCard VARCHAR() UNIQUE
)
/*创建年级表*/
drop table if exists grade
create table grade(
gradeID int primary key not null auto_increment,
gradeName VARCHAR() not null
)
/*创建科目表*/
CREATE TABLE `subject` (
`subjectNo` int() NOT NULL auto_increment,
`subjectName` varchar(),
`classHour` int(),
`gradeID` int(),
PRIMARY KEY (`subjectNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*创建成绩表*/
drop table if exists `result`
CREATE TABLE `result` (
`resultNo` int not null auto_increment,
`studentNo` int() not null,
`subjectNo` int() NOT NULL,
`examDate` DATETIME not NULL DEFAULT NOW(),
`studentResult` int() not NULL,
PRIMARY KEY (`resultNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

添加汉字数据的时候如果报错,说什么未定义的数据类型,就把你的默认字符集latin改成utf8就行了.具体方法不赘述了

三.添加外键约束

 /*给student,grade表创建外键约束*/
alter table `student` add CONSTRAINT fk_grade_student_gradeID foreign KEY(`gradeID`) REFERENCES `grade` (`gradeID`)

运行这行代码会报错.

SQL Error [1215] [HY000]: Cannot add foreign key constraint
  java.sql.SQLException: Cannot add foreign key constraint
下面总结几个创建外键失败的原因:

1.企图在主表创建外键

2.两表中有非法记录

3.两表公共列数据类型不同(长度,特性eg.unsigned)

这里grade表中gradeID的数据类型及特性是int ,大家都知道int的默认长度是11

student表中gradeID的数据类型是 int(4) UNSIGNED

两字段数据长度及特性不一致.

 alter table student change gradeID gradeID int
desc student
alter table `student` add CONSTRAINT fk_grade_student_gradeID foreign KEY(`gradeID`) REFERENCES `grade` (`gradeID`)

修改Student表中gradeID数据类型为int,再执行添加外键的操作,添加外键成功.

然后添加其他外键.

 /*subject,grade表创建外键约束*/
alter table subject change gradeID gradeID int
desc subject
alter table `subject` add CONSTRAINT fk_grade_subject_gradeID foreign KEY(`gradeID`) REFERENCES `grade` (`gradeID`)
/*学生表与成绩表创建外建约束*/
alter table `result` add CONSTRAINT fk_student_result_studentNo foreign KEY(`studentNo`) REFERENCES `student` (`studentNo`)
/*科目表与成绩表创建外建约束*/
alter table `result` add CONSTRAINT fk_subject_result_subjectNo foreign KEY(`subjectNo`) REFERENCES `subject` (`subjectNo`)

到这里就完成了四个表的外键约束.

4.为student表中studentNo添加自增

当初创建表的时候没加自增,现在想加了,怎么办?

 alter table student change studentNo studentNo int() NOT NULL auto_increment

使用alter语句发现报错.

SQL Error [1832] [HY000]: Cannot change column 'studentNo': used in a foreign key constraint 'fk_student_result_studentNo'
  java.sql.SQLException: Cannot change column 'studentNo': used in a foreign key constraint 'fk_student_result_studentNo'
没办法了,这里只能先删除外键约束,再添加自增.

 /*删除外键约束*/
ALTER TABLE `result` DROP FOREIGN KEY fk_student_result_studentNo
ALTER TABLE `result` DROP FOREIGN KEY fk_subject_result_subjectNo
ALTER TABLE `subject` DROP FOREIGN KEY fk_grade_subject_gradeID
ALTER TABLE `student` DROP FOREIGN KEY fk_grade_student_gradeID

一共四条外建约束,需要删除哪条约束就执行哪行吧.

删除外键之后四个表就很干净了,没有任何关联.然后可以进随便行修改字段,truncate table 等操作.

 /*想要truncate table 必须先清除外建约束
* truncate 语句不记录日志,删除后自增列从1开始,只能删除整个表数据
* delete 记录日志,删除后自增列序号断裂,+where条件可删除若干行
* truncate删除得更彻底,性能比delete高
* */
TRUNCATE TABLE subject
TRUNCATE TABLE student
TRUNCATE TABLE `result`
TRUNCATE TABLE grade

执行添加自增操作:

 alter table student change studentNo studentNo int() NOT NULL auto_increment

下面可以添加测试数据了.这里因为有外键约束,所以注意一下先添加主表数据,再添加从表数据.然后不要有非法数据就可以了.

 /*为各表插入数据*/
insert into grade (gradeName) VALUES('T15')
insert into subject (subjectName,classHour,gradeID) VALUES('语文',,),('数学',,)
desc student
insert into student(loginPwd,studentName,sex,gradeID,phone,address,bornDate,email,identifyCard) VALUES
('','强哥','女',,'','新加坡',now(),'qq@126.com','')
desc `result`
insert into `result`(studentNo,subjectNo,examDate,studentResult) VALUES(,,now(),)
insert into `result`(studentNo,subjectNo,examDate,studentResult) VALUES(,,now(),)

最后附上表图.

Java学习笔记——MySQL创建表结构的更多相关文章

  1. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  2. MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  3. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  4. MySQL/MariaDB学习笔记——mysql.user表中存在多个root用户问题理解

    mysql.user表中存在多个root用户问题 问题描述:使用 SELECT host,user FROM mysql.user 发现mysql.user表中存在三个root用户,如下 持着对中几个 ...

  5. Java学习笔记——MySQL的安装使用以及SQL语法简介

    在 Java 的开发中,数据库的应用是非常必要的,下面,我们为Java对于数据库的应用做一些必要的准备工作.. Java 对数据库的应用统称为 JDBC. JDBC(Java Data Base Co ...

  6. Java学习笔记-13.创建窗口和程序片

    1.init()方法:程序片第一次被创建,初次运行初始化程序片时调用. start()方法:每当程序片进入web浏览器中,并且允许程序片启动他的常规操作时调用(特殊的程序片被stop()关闭):同样在 ...

  7. Effective Java 学习笔记之创建和销毁对象

    一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...

  8. Java学习笔记——MySQL开放3306接口与设置用户权限

    系统Ubuntu16.04 LTS 1.开放3306端口查看端口状态:netstat -an|grep 3306tcp        0      0 127.0.0.1:3306          ...

  9. CUBRID学习笔记 30 复制表结构 cubrid教程

    语法 CREATE {TABLE | CLASS} <new_table_name> LIKE <old_table_name> 如下 CREATE TABLE a_tbl( ...

随机推荐

  1. 还在使用vc6.0吗??vs2010吧

    每个人在面对新的事物的时候,总是充满了排斥感,当vista和win7来临的时候,我们还在留恋xp,说xp是如何的好,win7是如何的不给力,当然,我们必须承认,xp是一款优秀的操作系统,这个我们无法否 ...

  2. CentOS 7.3最小系统安装KVM

    一.准备工作 安装wget和vim yum install -y wget vim 修改yum源为阿里源 wget -O /etc/yum.repos.d/CentOS-Base.repo http: ...

  3. MVC HttpUtility.HtmlEncode是如何编码的

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;us ...

  4. WPF 附加属性的使用

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  5. python 编码转换 专题

    主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...

  6. UWP显示对话框

    public static async void ShowMessage(string message) { var msgDialog = new Windows.UI.Popups.Message ...

  7. mysq练习(二)

    Mysql练习(二) 1. delete,drop,truncate 的区别? 可以参考这位的:  https://www.cnblogs.com/zhizhao/p/7825469.html 2. ...

  8. RPG Maker MV游戏解包

    该文章最新版本请前往:https://www.crowsong.xyz/127.html 前言 使用Petschko's RPG-Maker-MV File-Decrypter进行解包 使用Petsc ...

  9. 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)

    我做Python窗口界面编程时,经常使用PyQt进行设计.这里简单叙述一下使用PyQt5制作一个简单的图形界面的流程 PyQt的简介以及开发环境的搭建在此不多赘述. 1.       打开Qt Des ...

  10. linux log rotate

    今天老大提醒我产线kafka自身的log文件积累了好几个月了,我才发现原来kafka的log4j并删除old log. 第一反应是采用linux自带的logrotate功能,在/etc/logrota ...