zoukankan      html  css  js  c++  java
  • MySQL——外键、DML语言(添加、修改、删除)

    说明:如下的操作都是根据所创建的表,用写的sql语句动态变化,效果图能附上的都附上了

    1.1、外键

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

    CREATE TABLE `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(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
       `pwd` VARCHAR(20)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_gradeid` (`gradeid`),
       CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    

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

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

    语法:ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 那个表(哪个字段)

    CREATE TABLE `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(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
       `pwd` VARCHAR(20)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`);
    
    

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

    最佳实践:

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

    1.2、DML语言(全部记住)

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

    DML 语言: 数据操作语言

    • Insert 添加
    • update 修改
    • delete 删除

    1.2.1、添加

    insert

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

    1.插入一个字段

    -- 插入语句(添加)
    INSERT INTO `grade`(`gradename`) VALUES('大四')
    -- 由于主键自增我们可以省略 (如果不写表的字段,他就会一一匹配)
    INSERT INTO `grade` VALUES('大三')  --  Column count doesn't match value count at row 1
    -- 所以一般写插入语句,我们一定要数据和字段一一对应!
    

    效果:

    2.插入多个字段

    INSERT INTO `student`(`name`) VALUES ('张三')
    
    INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('张三','aaaaaa','男')
    
    INSERT INTO `student`(`name`,`pwd`,`sex`) 
    VALUES ('李四','aaaaaa','男'),('王五','aaaaaa','男')
    

    效果:

    注意事项:

    1. 字段和字段之间使用 英文逗号 隔开
    2. 字段是可以省略的,但是后面的值必须要要一一对应,不能少
    3. 可以同时插入多条数据,VALUES 后面的值,需要使用,隔开即可 VALUES(),(),....

    1.2.2、修改

    update

    语法:UPDATE 表名 set colnum_name = value,[colnum_name = value,....] where [条件]

    1、修改学员名字,带了简介

    UPDATE `student` SET `name`='姜嘉航' WHERE id = 1;
    

    效果:

    2、不指定条件的情况下,会改动所有表!

    UPDATE `student` SET `name`='姜嘉航'
    

    效果:

    3、修改多个属性,逗号隔开

    UPDATE `student` SET `name`='Godles',`email`='291652685@qq.com' WHERE id = 1;
    

    效果:

    4、在某个区间内修改

    UPDATE `student` SET `name`='Godles',`email`='291652685@qq.com' WHERE id < 4;
    

    效果:

    我们通过案例可以知道where id 等于没某个值或者大于某个值,可以在在某个区间内修改,操作会返回 布尔值

    5、不同操作符的含义、范围和结果

    操作符 含义 范围 结果
    = 等于 5=6 false
    <> 或 != 不等于 5<>6 true
    > 大于
    < 小于
    <= 小于等于
    >= 大于等于
    BETWEEN … and … 在某个范围内 [2,5]
    AND 我和你 && 5>1 and 1>2 false
    OR 我或你 || 5>1 or 1>2 true

    6、通过多个条件定位数据

    语法:UPDATE 表名 set colnum_name = value,[colnum_name = value,....] where [条件]

    UPDATE `student` SET `name`='长江7号' WHERE `name`='姜嘉航' AND sex='男'
    

    效果:

    注意:

    • colnum_name 是数据库的列,尽量带上``
    • 条件,筛选的条件,如果没有指定,则会修改所有的列
    • value,是一个具体的值,也可以是一个变量
    • 多个设置的属性之间,使用英文逗号隔开

    1.2.3、删除

    1、delete 命令

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

    -- 删除数据 (避免这样写,会全部删除)
    DELETE FROM `student`
    
    -- 删除指定数据
    DELETE FROM `student`WHERE id = 1;
    

    效果:

    2、TRUNCATE 命令

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

    -- 清空 student 表
    TRUNCATE `student`
    

    3、delete 的 TRUNCATE 区别

    • 相同点:都能删除数据,都不会删除表结构
    • 不同:
      • TRUNCATE 重新设置 自增列 计数器会归零
      • TRUNCATE 不会影响事务
    -- 测试delete 和 TRUNCATE 区别
    CREATE TABLE `test`(
      `id` INT(4) NOT NULL AUTO_INCREMENT,
      `coll` VARCHAR(20) NOT NULL,
      PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3')
    
    

    我们可以看一下test表的自动增量,步骤如下:

    1. 右键点击test
    2. 改变表
    3. 右侧选项栏里的高级

    我们到这一步看到这个自动增量为:

    然后运行:

    DELETE FROM `test`
    

    再次打开自动增量看到:

    结论:delete不会影响表的自动增量

    继续运行:

    TRUNCATE TABLE `test` 
    

    再次打开自动增量可以看到:

    结论:TRUNCATE会影响表的自动增量,自增会归零!

    4、delete删除问题

    如果用了delete删除后,重启数据库会发生什么现象?

    我们知道MySQL有两个引擎,在两个引擎中用delete发生的现象

    • InnoDB 自增列会重1开始 (存在内存当中的,断电即失)
    • MyISAM 继续从上一个自增量开始 (存在文件中的,不会丢失)
  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/godles/p/12202847.html
Copyright © 2011-2022 走看看