• MySQL数据管理


    一---外键(了解即可)

     1 CREATE TABLE `grade`(
     2  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
     3  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
     4  PRIMARY KEY(`gradeid`)
     5 )ENGINE=INNODB DEFAULT CHARSET=utf8
     6 
     7 -- 学生表的gradeid 字段要去引用年级表的 gradeid
     8 -- 定义外键key
     9 -- 给这个外键添加约束(执行引用) references 引用
    10 
    11 CREATE TABLE IF NOT EXISTS `student`(
    12   `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    13   `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    14   `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    15   `sex` INT(4) NOT NULL  COMMENT '性别',
    16   `birthday` DATETIME DEFAULT NULL  COMMENT '生日',
    17   `gradeid` INT(10) NOT NULL  COMMENT '学生的年级',
    18   `address` VARCHAR(30) NOT NULL  COMMENT '地址',
    19   `email` VARCHAR(30) DEFAULT NULL  COMMENT '邮箱',
    20   PRIMARY KEY(`id`),
    21   KEY `FK_gradeid` (`gradeid`),
    22   CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
    23 )ENGINE=INNODB DEFAULT CHARSET=utf8
    24 
    25 -- 创建表的时候没有外键关系
    26 ALTER TABLE `student`
    27 ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) references `grade`(`gradeid`);
    28 
    29 -- ALTER TABLE 表
    30 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) references 哪个表(哪个字段);
    

    以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,因为有外键的话想删表删不掉)

    最佳方案:

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

    阿里编程规范中提到:

    • 【强制】不得使用外键与级联,一切外键必须在应用层解决
    • 每次做delete或者update都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便

    二---DML语言(全部记住并背下来)

    • 添加
     1 -- 插入语句(添加)
     2 -- insert into 表名(字段1,字段2,字段3)values('值1','值2', '值3')
     3 INSERT INTO `grade`(`gradename`) 
     4 VALUES('大三')
     5 -- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
     6 -- 下面的语句会报错,因为匹配的字段是id
     7 INSERT INTO `grade` VALUES(`大三`)
     8 
     9 -- 一般写插入语句,我们一定要数据和字段一一对应
    10 
    11 -- 插入多个字段
    12 INSERT INTO `grade`(`gradename`)
    13 VALUES('大二'),
    14 ('大一')

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

    注意事项:

    1. 字段和字段之间使用英文逗号隔开
    2. 字段是可以省略的吗,但是后面的值必须要一一对应,不能少
    3. 可以同时插入多条数据,values后面的值,需要使用,隔开
    4. 由于外键的约束,我们往表里插数据的时候,注意两张表外键的值要一样,否则插入失败
    • 修改
    1 -- 修改学生名字,带条件
    2 UPDATE `student` SET`name`='德胜' WHERE `id`=3
    3 
    4 -- 修改学生名字不带条件,全改了
    5 UPDATE `student` SET`name`='德胜'
    6 
    7 -- 修改多个属性,逗号隔开
    8 UPDATE `student` SET`name`='德胜',`address`='北京' WHERE `id`=3

    语法: update 表名 set column_name=value,[column_name=value] where [条件]

    条件操作符:

    • <> 或!= 是不等于
    • and连接多个条件

    注意事项:

    • colume_name 是数据库的列,尽量带上``
    • 条件,筛选的条件,如果没有指定的话,则会修改所有的列
    • value 是一个具体的值,也可以是一个变量
      1 UPDATE `student` SET`name`='德胜',`address`='北京',`birthday`=CURRENT_TIME WHERE `id`=3
    • 删除

    delete命令

    语法:delete from 表名 [where 条件]

    1 -- 避免这样写,会全部删除
    2 DELETE FROM `student`
    3 
    4 -- 删除指定数据
    5 DELETE FROM `student` WHERE `id`=4

    TRUNCATE 命令

    作用:完全清空一个数据库表,表的结构和索引约束不会变

    语法:truncate table 表名


    delete和truncate区别

    • 相同点:都能删除数据,都不会删除表结构
    • 不同:
    1. truncate 重新设置 自增列 计数器会归零
    2. truncate 不会影响事务

         

     1 CREATE TABLE `test`(
     2 `id` INT(10) NOT NULL AUTO_INCREMENT,
     3 `coll` VARCHAR(20) NOT NULL,
     4 PRIMARY KEY(`id`)
     5 )ENGINE=INNODB  DEFAULT CHARSET=utf8
     6 
     7 INSERT INTO `test` (`coll`)
     8  VALUES('1'),('2'),('3')
     9  
    10  DELETE FROM `test`
    11  
    12  TRUNCATE TABLE `test`

     

     拓展:delete删除的问题,重启数据库时候的现象

    • innodb 自增会从1开始(存在内存当中时,断电即失)
    • myisam 继续从上一个增量开始(存在文件中的,不会丢失)
  • 相关阅读:
    超酷的元素周期表
    TestLink在线Excel用例转换xml
    我也学习JAVA多线程-join
    request.getSession(true/false)的区别
    nginx location配置详细解释
    RestTemplate--解决中文乱码
    扇贝-每日一句
    Hexo博客系列(三)-将Hexo v3.x个人博客发布到GitLab Pages
    C程序的内存分区(节选自黑马训练营day1)
    CodeBlocks更换界面主题界面、汉化及去掉注释及字符串的下划线(汉化包的链接来自本站的BeatificDevin大神)
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14752573.html
Copyright © 2020-2023  润新知