Java學習筆記——MySQL建立表結構

一.建立/刪除數據庫.java

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

二.建立若干表用於測試sql

這裏預留了幾個坑,下面要填坑的..數據庫

 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就好了.具體方法不贅述了ide

三.添加外鍵約束性能

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
下面總結幾個建立外鍵失敗的緣由:spa

1.企圖在主表建立外鍵3d

2.兩表中有非法記錄日誌

3.兩表公共列數據類型不一樣(長度,特性eg.unsigned)code

這裏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)

最後附上表圖.

相關文章
相關標籤/搜索