六、约束(主键约束、唯一约束、非空约束、检查约束、外键约束)

痛定思痛。 2023-10-04 19:23 101阅读 0赞
  1. ## 约束,数据类型,触发器
  2. ## 保证数据的正确性,完整性,有效性
  3. /*
  4. 主键约束
  5. 唯一约束
  6. 非空约束
  7. 检查约束 (mysql8才有)
  8. 外键约束
  9. 默认值约束
  10. */

1.主键约束

  1. ## 主键约束: 唯一非空
  2. ## 注意: 一张表只能有一个主键约束
  3. ## 主键: 单列主键, 组合主键(多列组合形成一个主键)
  4. ## 关键字: PRIMARY KEY
  5. ## 第一种: 创建表的时候, 列声明后面
  6. DROP TABLE tb_user;
  7. CREATE TABLE tb_user(
  8. id INT PRIMARY KEY,
  9. username VARCHAR(30),
  10. `password` VARCHAR(30),
  11. age INT
  12. )
  13. INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '123', 21) ;
  14. INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'李四', '345', 21) ;
  15. ## 第一种: 创建表的时候,所有列声明之后,另起一行设置主键约束
  16. CREATE TABLE tb_user(
  17. id INT,
  18. username VARCHAR(30),
  19. `password` VARCHAR(30),
  20. age INT,
  21. PRIMARY KEY(id)
  22. )
  23. ## 表主键有id,与username共同组合成一个主键
  24. CREATE TABLE tb_user(
  25. id INT,
  26. username VARCHAR(30),
  27. `password` VARCHAR(30),
  28. age INT,
  29. PRIMARY KEY(id,username)
  30. )
  31. INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '123', 21) ;
  32. INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'李四', '345', 21) ;
  33. INSERT INTO tb_user (id,username, `password`, age) VALUE (1,'zhangsan', '44545', 22) ;
  34. ##组合主键: PRIMARY KEY(id,username)
  35. ## id,与username都一样,才是重复值
  36. CREATE TABLE tb_user(
  37. id INT,
  38. username VARCHAR(30),
  39. `password` VARCHAR(30),
  40. age INT
  41. )
  42. ##第三种写法: 对存在的表,添加主键
  43. ## ALTER TABLE 表名 ADD PRIMARY KEY(列名);
  44. ALTER TABLE tb_user ADD PRIMARY KEY(id);
  45. ## 主键约束,唯一约束, 把这个约束作为一个索引(提高查询效率)
  46. /*
  47. 主键设置经验:
  48. 1. 主键一般不要设置在有意义的列, 一般都表设置一个id, 作为主键
  49. 2. 修改数据,不会修改主键
  50. */
  51. ## id 一般是数字
  52. ## 唯一: mysql提供: 自增列
  53. ## 设置自增列 AUTO_INCREMENT
  54. ## 创建表的时候, 设置自增列
  55. CREATE TABLE tb_user(
  56. id INT PRIMARY KEY AUTO_INCREMENT,
  57. username VARCHAR(30),
  58. `password` VARCHAR(30),
  59. age INT
  60. )
  61. #使用: 每次执行insert的时候, 在上一次值加1作为insert插入值
  62. #从1开始
  63. #写insert语句的时候, 自增列不需要手动赋值
  64. INSERT INTO tb_user (username, `password`, age) VALUE ('zhangsan', '123', 21) ;
  65. INSERT INTO tb_user (username, `password`, age) VALUE ('lisi', '123', 21) ;
  66. #如果给自增列手动赋值 id:100
  67. INSERT INTO tb_user (id,username, `password`, age) VALUE (100,'wangwu', '123', 21) ;
  68. ## 下一次执行insert, 自增列从 101
  69. INSERT INTO tb_user (username, `password`, age) VALUE ('zhaoliu', '123', 21) ;
  70. ## 执行删除操作,
  71. DELETE FROM tb_user WHERE id = 2;
  72. INSERT INTO tb_user (username, `password`, age) VALUE ('lisisi', '123', 21) ;
  73. DROP TABLE tb_user;
  74. #第二种创建: 对已存在的表添加自增列
  75. CREATE TABLE tb_user(
  76. id INT PRIMARY KEY ,
  77. username VARCHAR(30),
  78. `password` VARCHAR(30),
  79. age INT
  80. )
  81. ALTER TABLE tb_user CHANGE id id INT AUTO_INCREMENT;
  82. ##删除自增
  83. ALTER TABLE tb_user CHANGE id id INT ;

2.唯一约束

  1. ## 唯一约束 关键字: UNIQUE
  2. ## 值唯一,允许有一个null
  3. /*
  4. 唯一约束与主键约束的区别:
  5. 1. 唯一约束:值唯一,允许有一个null, 主键约束:值唯一,不允许有null,
  6. 2. 一张表可以有多个唯一约束, 但只能有一个主键约束
  7. */
  8. CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(30) UNIQUE, `password` VARCHAR(30), gender VARCHAR(2))INSERT INTO tb_user(username,`password`,gender)VALUES('zhangsan','123','男');INSERT INTO tb_user(username,gender)VALUES('lisi','男');

3.非空约束

  1. ## 默认值约束 给某列设置一个默认值
  2. ## 关键字: default
  3. ## 没有设置默认值, 默认值null
  4. ## 关键字: default
  5. ## 没有设置默认值, 默认值null
  6. CREATE TABLE tb_user(
  7. id INT PRIMARY KEY,
  8. username VARCHAR(30) UNIQUE NOT NULL,
  9. `password` VARCHAR(30) NOT NULL,
  10. gender VARCHAR(2) DEFAULT '男'
  11. )
  12. INSERT INTO tb_user(username,`password`,gender)VALUES('zhangsan1','123','女');
  13. INSERT INTO tb_user(username,`password`)VALUES('lisi','123');

4.检查约束

  1. ##检查约束 关键字 check 在mysql8才有
  2. ## 限制值的范围 check gender='女' or gender='男'

5.外键约束

  1. ## 外键: 维护表与表关系,
  2. ##A表与B表的关系, 在B表中添加一列, 引用A表的某列的值
  3. ## 添加的一列是外键
  4. ## 外键约束: 限制外键的值的范围, 外键列的值的范围, 只能是引用表中引用列的值
  5. ## 在互联网开发中, 外键一定有的, 但是外键约束一般不加
  6. ## 订单表:
  7. ## userId的值必须来源tb_user的id的值
  8. /*
  9. 创建表的时候: 外键取名: fk_表名_列名
  10. [ CONSTRAINT ] [ 外键名称 ] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
  11. */
  12. DROP TABLE tb_order; #从表
  13. DROP TABLE tb_user; #主表
  14. CREATE TABLE tb_order(
  15. id INT PRIMARY KEY AUTO_INCREMENT,
  16. createTime DATETIME,
  17. price DOUBLE(7,2),
  18. userId INT,
  19. CONSTRAINT fk_tb_order_userId FOREIGN KEY(userId) REFERENCES tb_user(id)
  20. )
  21. INSERT INTO tb_order(createtime,price,userId) VALUES('2022-08-12 08:57:43',199,1);
  22. INSERT INTO tb_order(createtime,price,userId) VALUES('2022-08-13 09:57:43',199,3);
  23. /*
  24. 使用外键约束:
  25. 创建表的顺序: 先主表,再从表
  26. 删除表的顺序: 先从表,再主表
  27. 外键约束 引用的主表列必须是主键约束或者是唯一约束
  28. */
  29. #第二种创建外键约束:
  30. # 对存在的表添加一个外键约束:
  31. #ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
  32. CREATE TABLE tb_order(
  33. id INT PRIMARY KEY AUTO_INCREMENT,
  34. createTime DATETIME,
  35. price DOUBLE(7,2),
  36. userId INT
  37. )
  38. ALTER TABLE tb_order
  39. ADD CONSTRAINT fk_tb_order_userId FOREIGN KEY(userId)
  40. REFERENCES tb_user(id);
  41. ##外键约束删除数据,修改外键数据的操作
  42. ## 删除:
  43. ## 删除id为1的用户
  44. ## 如果主表这条记录在从表有引用,默认删除失败
  45. DELETE FROM tb_user WHERE id = 1;
  46. /*
  47. NO ACTION: 默认行为
  48. 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。
  49. (与 RESTRICT 一致) 默认行为
  50. CASCADE: 级联删除/修改
  51. 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,
  52. 则也删除/更新外键在子表中的记录
  53. SET NULL:
  54. 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null
  55. (这就要求该外键允许取null)
  56. */
  57. ##CASCADE:
  58. ALTER TABLE tb_order
  59. ADD CONSTRAINT fk_tb_order_userId FOREIGN KEY(userId)
  60. REFERENCES tb_user(id) ON UPDATE CASCADE ON DELETE CASCADE;
  61. DELETE FROM tb_user WHERE id = 1;

发表评论

表情:
评论列表 (有 0 条评论,101人围观)

还没有评论,来说两句吧...

相关阅读