zoukankan      html  css  js  c++  java
  • Java学习笔记——MySQL创建表结构

    一.创建/删除数据库.

    1 create database t14;
    2 drop database t14;
    3 use t14;

    二.创建若干表用于测试

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

     1 /*创建学生表*/
     2 create table student(
     3     studentNo int(4) PRIMARY KEY not null,
     4     loginPwd VARCHAR(20) not null,
     5     studentName VARCHAR(50) not NULL,
     6     sex char(2) not null DEFAULT '',
     7     gradeID int(4) UNSIGNED,
     8     phone VARCHAR(50),
     9     address VARCHAR(255) default '地址不详',
    10     bornDate DATETIME,
    11     email VARCHAR(50),
    12     identifyCard VARCHAR(18) UNIQUE
    13 )
    14 /*创建年级表*/
    15 drop table if exists grade
    16 create table grade(
    17     gradeID int primary key not null auto_increment,
    18     gradeName VARCHAR(32) not null
    19 )
    20 /*创建科目表*/
    21 CREATE TABLE `subject` (
    22   `subjectNo` int(4) NOT NULL auto_increment,
    23   `subjectName` varchar(50),
    24   `classHour` int(4),
    25   `gradeID` int(4),
    26   PRIMARY KEY (`subjectNo`)
    27 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    28 /*创建成绩表*/
    29 drop table if exists `result`
    30 CREATE TABLE `result` (
    31   `resultNo` int not null auto_increment,
    32   `studentNo` int(4) not null,
    33   `subjectNo` int(4) NOT NULL,
    34   `examDate` DATETIME not NULL DEFAULT NOW(),
    35   `studentResult` int(4) not NULL,
    36   PRIMARY KEY (`resultNo`)
    37 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

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

    三.添加外键约束

    1 /*给student,grade表创建外键约束*/
    2 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

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

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

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

    然后添加其他外键.

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

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

    4.为student表中studentNo添加自增

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

    1 alter table student change studentNo studentNo int(4) 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'
    没办法了,这里只能先删除外键约束,再添加自增.

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

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

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

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

    执行添加自增操作:

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

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

    1 /*为各表插入数据*/
    2 insert into grade (gradeName) VALUES('T15')
    3 insert into subject (subjectName,classHour,gradeID) VALUES('语文',60,1),('数学',60,1)
    4 desc student
    5 insert into student(loginPwd,studentName,sex,gradeID,phone,address,bornDate,email,identifyCard) VALUES
    6 ('000000','强哥','',1,'120','新加坡',now(),'qq@126.com','410523195601016754')
    7 desc `result`
    8 insert into `result`(studentNo,subjectNo,examDate,studentResult) VALUES(1,1,now(),90)
    9 insert into `result`(studentNo,subjectNo,examDate,studentResult) VALUES(1,2,now(),90)

    最后附上表图.

  • 相关阅读:
    年轻程序员不讲武德,做表竟然拖拉拽
    如何做好一个领导者?
    创业相关的书籍推荐
    有关创新思维的书籍推荐
    如何做好公司企业文化建设?
    组织变革的类型
    怎样进行自我管理?这些书告诉你答案
    PHP分页算法
    Knockoutjs 实现省市联动
    MySQL InnoDB存储引擎外键约束
  • 原文地址:https://www.cnblogs.com/tomasman/p/7151962.html
Copyright © 2011-2022 走看看