外键

  • 方式一、在创建表时增加约束 ``sql CREATE TABLE IF NOT EXISTSgrade(gradeidINT(10) NOT NULL AUTO_INCREMENT COMMENT'年级',gradenameVARCHAR(20) NOT NULL COMMENT'年级名称', PRIMARY KEY(gradeid`) )ENGINE=INNODB DEFAULT CHARSET=utf8

—定义外键key —给这个外键添加约束(执行引用)constraint —references 引用 CREATE TABLE IF NOT EXISTS user( id INT(10) NOT NULL AUTO_INCREMENT COMMENT’唯一标识符’, name VARCHAR(30) NOT NULL DEFAULT’匿名’ COMMENT’姓名’, gradeid INT(10) NOT NULL COMMENT’学生年级’, pwd VARCHAR(20) NOT NULL DEFAULT’123456’ COMMENT’密码’, swx VARCHAR(2) NOT NULL DEFAULT’女’ COMMENT’性别’, birthday DATETIME DEFAULT NULL COMMENT’出生日期’, address VARCHAR(100) DEFAULT NULL COMMENT’家庭住址’, email VARCHAR(30) DEFAULT NULL COMMENT’邮箱’, PRIMARY KEY (id), KEY FK_gradeid (gradeid) , CONSTRAINT FK_gradeid FOREIGN KEY (gradeid) REFERENCES grade(gradeid) )ENGINE =INNODB DEFAULT CHARSET=utf8

  1. 删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
  2. - 方式二 创建表成功后 再添加外键约束
  3. ```sql
  4. CREATE TABLE IF NOT EXISTS `grade`(
  5. `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT'年级',
  6. `gradename` VARCHAR(20) NOT NULL COMMENT'年级名称',
  7. PRIMARY KEY(`gradeid`)
  8. )ENGINE=INNODB DEFAULT CHARSET=utf8
  9. --定义外键key
  10. --给这个外键添加约束(执行引用)constraint
  11. --references 引用
  12. CREATE TABLE IF NOT EXISTS `user`(
  13. `id` INT(10) NOT NULL AUTO_INCREMENT COMMENT'唯一标识符',
  14. `name` VARCHAR(30) NOT NULL DEFAULT'匿名' COMMENT'姓名',
  15. `gradeid` INT(10) NOT NULL COMMENT'学生年级',
  16. `pwd` VARCHAR(20) NOT NULL DEFAULT'123456' COMMENT'密码',
  17. `swx` VARCHAR(2) NOT NULL DEFAULT'女' COMMENT'性别',
  18. `birthday` DATETIME DEFAULT NULL COMMENT'出生日期',
  19. `address` VARCHAR(100) DEFAULT NULL COMMENT'家庭住址',
  20. `email` VARCHAR(30) DEFAULT NULL COMMENT'邮箱',
  21. PRIMARY KEY (`id`)
  22. )ENGINE =INNODB DEFAULT CHARSET=utf8

添加外键约束

  1. --创建表的时候没有外键关系
  2. ALTER TABLE `student`
  3. ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
  4. --ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (作为外键的列) REFERENCES 引用的列

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

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

    DML语言

    数据库意义:数据存储,数据管理
    DML语言:数据操作数据

  • Insert

  • update
  • select
  • delete

    insert(添加)

    ```sql —由于主键自增可以省略(如果不写表的字段,会一一匹配) —一般写插入语句,字段与数据要一一对应 INSERT INTO 表名(字段名1,字段名2,字段名3) VALUES(值1,值2,值3);

INSERT INTO grade(gradename)VALUES(‘计科一班’);

  1. <a name="YJvcL"></a>
  2. ### update(修改)
  3. ```sql
  4. --修改表
  5. --UPdate 表名 SET 字段=新值 WHERE 条件
  6. UPDATE `student` SET `name`='铁柱' WHERE id=2;
  7. --不指定条件的情况下会改变所有表中的所有数据
  8. UPDATE `student` SET `name`='铁柱';
  9. --修改多个属性,用逗号隔开
  10. UPDATE `student` SET `name`='翠花',`email`='@qq.com' WHERE id=3;
  11. --赋值可以是一个变量
  12. UPDATE `student` SET `birthday`=CURRENT_DATE --CURRENT_DATE获取当前时间

delete(删除)

  1. --删除
  2. --delete FROM 表名 WHERE 条件
  3. DELETE FROM `student` WHERE id=4;
  4. --清空一张表
  5. Delete `student`;
  6. TRUNCATE `student`;

Delete与truncate的区别

  • 相同点:都能删除数据 都不会删除表结构
  • 不同点:
    • Truncate 重新设置 自增列 计数器归零 例:Truncate清空一张表后 自增的字段归零 delete清空一张表后 再插入数据会以之前的数据为起点开始自增
    • Truncate 不会影响事务()

Delete删除的问题,重启数据库,现象

  • INNODB 自增列从1开始(存在内存中 断电即失)
  • MYISAM 继续从上一个自增量开始(存在文件中 不会丢失)