2.6 修改、删除表

修改表的属性

-- 修改表名:ALTER TABLE 旧表名 RENAME AS 新表名
 ALTER TABLE teacher RENAME AS teacher1
 
 -- 增加表的字段:ALTER TABLE 表名 ADD 字段名 列属性
 ALTER TABLE teacher1 ADD age INT(11)
 
 -- 修改表的字段(重命名,修改约束!)
 -- ALTER TABLE 表名 MODIFY 字段名 列属性[]
 ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- 修改约束
 -- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
 ALTER TABLE teacher1 CHANGE age age1 INT(1) -- 字段重命名
 
 -- 删除表的字段
 -- ALTER TABLE 表名 DROP 字段名
 ALTER TABLE teacher1 DROP age1
 

删除表

-- 删除表(存在的时候再删除,不加判断的话,会报错)
 DROP TABLE IF EXISTS teacher1

注意点:

  • 所有的创建和删除操作尽量加上判断,以免报错!!!
  • 字段名使用``修饰,避免与关键字重复!!!
  • 注释:-- 或者 /* */
  • sql关键字大小写不敏感,建议大家写小写!!!
  • 所有的符号全部用英文!!!

 

3 MySQL数据管理

3.1 外键(了解即可)

方式1:在创建表的时候,增加约束(麻烦,比较复杂)

CREATE TABLE IF NOT EXISTS `grade`(
   `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
   `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
   PRIMARY KEY(`gradeid`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 -- 学生表的gradeid字段要去引用年级表的gradeid
 -- 定义外键key
 -- 给这个外键添加约束(执行引用) references引用
 CREATE TABLE IF NOT EXISTS `student`(
   `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
   `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
   `pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
   `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
   `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
   `gradeid` INT(10) NOT NULL COMMENT '学生年级',
   `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
   `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
   PRIMARY KEY(`id`),
   KEY `FK_graded`(`gradeid`),
   CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8

  添加外键成功后,会多出来定义的外键FK_gradeid

python SQLAlchemy 外键 sqlyog外键_字段名

  改变表student,选择“3个外部键”

python SQLAlchemy 外键 sqlyog外键_字段名_02

  即可查看外部键

python SQLAlchemy 外键 sqlyog外键_字段名_03

  删除有外键关系的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)

python SQLAlchemy 外键 sqlyog外键_字段_04

python SQLAlchemy 外键 sqlyog外键_字段_05

  对于上面而言,要先删除student表,才能删除grade表。

方式2:创建表成功后,再添加外键约束

-- 创建grade表
 CREATE TABLE IF NOT EXISTS `grade`(
   `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
   `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
   PRIMARY KEY(`gradeid`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 
 -- 创建student表
 CREATE TABLE IF NOT EXISTS `student`(
   `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
   `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
   `pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
   `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
   `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
   `gradeid` INT(10) NOT NULL COMMENT '学生年级',
   `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
   `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
   PRIMARY KEY(`id`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 
 -- 创建表的时候没有外键关系,之后添加外键关系
 ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
 -- ALTER TABLE `要添加引用的表名` ADD COSTRAINT `约束名` FOREIGN KEY(`要作为外键的列`) REFERENCES `被引用的表名`(`被引用的字段`)

  以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,这里了解即可)

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(程序去实现)

附:数据库中为什么不推荐使用外键约束?_pojocheng的博客-CSDN博客

 

3.2 DML语言(全部记住)

数据库意义:数据存储 、数据管理

DML语言:数据操纵语言

  • Insert
  • update
  • delete

 

3.3 添加insert

语法:insert into 表名(字段名1,字段名2,...) values('值1','值2',...),('值1','值2',...),...

-- 语法:insert into `表名`(`字段名1`,`字段名2`,...) values('值1','值2',...),('值1','值2',...),...
 -- 插入语句(添加)
 -- insert into `表名`(`字段名1`,`字段名2`,...) values('值1','值2',...)
 INSERT INTO `grade`(`gradename`)VALUES('大四')
 
 -- 如果不写表的字段,它就会一一匹配,所有字段值都必须写全,此时主键值不能省略
 INSERT INTO `grade`VALUES('研一') -- 报错
 INSERT INTO `grade`VALUES(5,'研二') -- 成功
 
 -- 一般写插入语句,我们一定要使数据和字段一一对应!
 -- 插入一个字段多个值,主键自增可以忽略
 INSERT INTO `grade`(`gradename`)VALUES('大三'),('大二')
 
 INSERT INTO `student`(`name`)VALUES('赵四') -- 插入一个字段
 INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES('张三','111111','男') -- 插入多个字段
 
 -- 插入全部字段,不省略字段名
 INSERT INTO `student`(`name`,`pwd`,`sex`,`birthday`,`gradeid`,`address`,`email`)
 VALUES('王五','222222','男','2020-02-02','3','吉林','111@163.com'),
 ('小黄','222222','男','2020-02-02','3','吉林','111@163.com'),
 ('小红','222222','男','2020-02-02','3','吉林','111@163.com')
 
 -- 插入全部字段,省略全部字段名,此时不可以省略主键值
 INSERT INTO `student`VALUES
 (4,'王七','333333','男','2000-01-01','8','黑龙江','222@qq.com')
 -- 插入多个字段多个值,忽略字段名,此时不可以省略主键值
 INSERT INTO `student`VALUES
 (5,'1','1','男','2001-01-01','11','1','1@qq.com'),
 (6,'2','1','男','2002-01-01','12','1','2@qq.com'),
 (7