use 学生课程;
drop database 学生课程;show databases;
 
create database 学生课程;
use 学生课程;//使用数据库create table 学生 (
	学号	CHAR(4) NOT NULL,
    姓名	CHAR(10)	NOT NULL,
    性别	ENUM('男','女'),//枚举类型
    专业	CHAR(20),
    系别	CHAR(20),
    年级	CHAR(2),
    班别	CHAR(2),
    联系电话	CHAR(8),
    出生日期	DATE,
    地区来源	VARCHAR(30),
    变动情况	CHAR(10),
    政治面貌	CHAR(8),
    民族	CHAR(8) DEFAULT '汉',
    PRIMARY KEY (学号)
    )CHARSET=utf8;//字符设置create table 课程注册 (
	课程编号	CHAR(4),
    课程名称	CHAR(10)	UNIQUE,//唯一
    任课教师	CHAR(8),
    授课教室	CHAR(8),
    学分		INT,
    primary key (课程编号)//主键设置 我觉得吧这个写在定义后面也是可行的
    )CHARSET=utf8;create table 学期成绩 (
	学号	CHAR(4),
    课程编号 CHAR(4),
    成绩	REAL,
    备注	VARCHAR(50),
    foreign key (学号) references 学生(学号),
    foreign key (课程编号) references 课程注册(课程编号),//定义表格
    primary key (学号,课程编号)
    )CHARSET=utf8;

delimiter //
create trigger check_成绩 before insert on 学期成绩
for each row  //行级触发器
begin
	declare msg varchar(200);//声明变量
	if NEW.成绩 > 100 or NEW.成绩 < 0 then//条件判断
        set msg = '成绩范围有误,检查范围';//变量赋值
        signal sqlstate 'HY000' set message_text = msg;
	end if;//endif
end;//
delimiter ;//分隔符drop trigger check_学号;
alter table 学期成绩 modify column 成绩 real;
insert into 学生(学号,姓名,性别,专业,系别,年级,班别,联系电话,出生日期,地区来源,政治面貌,民族)
values('2012','李春刚','男','计算机应用','计算机','01','02','88923546','1985-2-10','呼市','团员','汉');update 学生 set 学号 = '0122' where 学号 = '2012';
insert into check_学号(学号,姓名,性别,专业,系别,年级,班别,联系电话,出生日期,地区来源,政治面貌,民族)
values('0012','李春刚','男','计算机应用','计算机','01','02','1245435','1985-2-10','呼市','团员','汉');insert into 课程注册(课程编号,课程名称,任课教师,授课教室,学分)
values('J134','计算机应用','王晓梅','4','4');insert into 学期成绩(学号,课程编号,成绩,备注)
values('2012','01',52,'33');select * from 学生 where 姓名 = '李春刚';
delete from 学期成绩 where 学号 = '0019';
delete from 学生 where 学号 = '2012';
delete from 课程注册 where 课程编号 = '134';select * from information_schema.TABLES;
select * from information_schema.COLUMNS;
select * from information_schema.KEY_COLUMN_USAGE;
show index from information_schema.tables;delimiter //
create trigger check_学号 before insert on 学生
for each row
begin
    if NEW.学号 not rlike '^[1-9][[:digit:]]{2}[1-9]$' 
    then
		signal sqlstate '45000' 
        set message_text = '学号格式有误';
	end if;
end;//
delimiter ;delimiter //
create trigger check_学号2 before update on 学生
for each row
begin
    if NEW.学号 not rlike '^[1-9][[:digit:]]{2}[1-9]$' 
    then
		signal sqlstate '45000' 
        set message_text = '学号格式有误';
	end if;
end;//
delimiter ;

create view check_学号 as
select * from 学生 
where 学号 rlike '^[1-9][[:digit:]]{2}[1-9]$' 
with check option;drop view check_学号;
delimiter //
create trigger check_课程编号 before insert on 课程注册
for each row
begin
    if NEW.课程编号 not rlike '^J[[:digit:]]{3}$' 
    then
		signal sqlstate '45000' 
        set message_text = '课程编号格式有误';
	end if;
end;//
delimiter ;delimiter //
create trigger check_课程编号2 before update on 课程注册
for each row
begin
    if NEW.课程编号 not rlike '^J[[:digit:]]{3}$' 
    then
		signal sqlstate '45000' 
        set message_text = '课程编号格式有误';
	end if;
end;//
delimiter ;update 课程注册 set 课程编号 = 'J123' where 课程编号 = 'J134';
drop trigger check_联系电话;
alter table 学生 modify column 性别 ENUM('男','女') default '男';
delimiter //
create trigger check_联系电话 before insert on 学生
for each row
begin
    if NEW.联系电话 not rlike '^8892[234][[:digit:]]{3}$' 
    then
		signal sqlstate '45000' 
        set message_text = '联系电话格式有误';
	end if;
end;//
delimiter ;alter table 学生 add column 班长 CHAR(4);
delimiter //
create trigger check_班长 before insert on 学生
for each row
begin
    if NEW.班长 not rlike '^[1-9][[:digit:]]{2}[1-9]$' 
    then
		signal sqlstate '45000' 
        set message_text = '学号格式有误';
	end if;
end;//
delimiter ;alter table 学生 drop column 政治面貌;
alter table 学生 add column 政治面貌 CHAR(8);
alter table 学生 add column 总学分 INT(11);alter table 课程注册 add column 授课学时 INT;
alter table 课程注册 add column 开课学期 INT;alter table 学生 change 年级 入学时间 DATE;