一.建立/刪除數據庫.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)
最後附上表圖.