一.创建/删除数据库.

 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. (记录)mysql分页查询,参数化过程的坑

    在最近的工作中,由于历史遗留,一个分页查询没有参数化,被查出来有sql注入危险,所以对这个查询进行了参数化修改. 一看不知道,看了吓一跳,可能由于种种原因,分页查询sql是在存储过程中拼接出来的,wh ...

  2. JNDI(Java Naming and Directory Interface)

    # 前言 内容基本拷贝,整理出来,方便以后回忆. # What The Java Naming and Directory Interface™ (JNDI) is an application pr ...

  3. git全程笔记(mac环境) git for mac

    一.git的安装 最简单的方式就是直接用git installer安装git(从git官网上下载一个git installler就可以直接安装了),mac上有自带的git,可能版本比较低 后面显示的是 ...

  4. VC中出现“烫”和“屯”的原因(栈区的每一个字节都被0xCC填充了,也就是int 3h的机器码,动态分配的堆,VC的Debug用0xCD填充堆的空间,就出现了“屯”)

    相信经常用VC的朋友对屏幕输出的一大堆“烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”不会陌生,但是也许会很奇怪,为什么会出现“烫”字呢?莫非改程序导致系统运行缓慢,发热过高???非也!下面让我解释 ...

  5. mage J和Graphpad如何对Western Blot条带灰度分析

    原文 mage J和Graphpad如何对Western Blot条带灰度分析 WB是研究蛋白表达的一个经典方法.对于一些时间点或者是不同组织蛋白表达量的分析就涉及到量的变化.一些凝胶成像软件带有此分 ...

  6. SQL Server修改标识列方法(备忘)

    原文:SQL Server修改标识列方法(备忘) SQL Server修改标识列方法 ----允许对系统表进行更新 exec sp_configure 'allow updates',1 reconf ...

  7. 把#define宏转换成指定格式

    之前在弄一个东西的,有一大堆的宏,需要把它转换成其它的形式.遇到这种大批量的东西,我特别没有耐心去一个一个的弄,于是写了一段代码. 估计大家平常比较难用得上,不过可以平常相似的情况用来参考. Sort ...

  8. C#WebBroswer控件的使用

    在WebBroswer中可以嵌入一个网页文件,通过Url属性绑定. URI,统一资源标识符,用来唯一的标识一个资源. URL,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源. 它包 ...

  9. Qt 5.6 5.8 vs2015 编译静态库版本(有全部的截图)good

    安装Qt 去Qt官网下载Qt安装包  安装Qt和源码,一定要勾选source选项  添加bin到系统变量  工具 需要python3和 perl. vs2015 第三方工具,到官方下载安装  在命令行 ...

  10. strlen源码剖析(可查看glibc和VC的CRT源代码)

    学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简单的 ...