深入探讨MySQL约束:主键、非空、唯一、外键 ️ 摘要 大家好,我是默语,擅长全栈开发、运维和人工智能技术。...在这篇博客中,我将详细介绍MySQL中各种约束的使用,包括主键约束、非空约束、唯一约束和外键约束。这些约束是保证数据库完整性和数据一致性的关键。...关键词:MySQL约束、主键、非空、唯一、外键、数据库设计。 引言 MySQL约束是数据库设计中至关重要的一部分。通过设置合适的约束,可以有效地防止不合法的数据插入表中,从而保证数据的一致性和完整性。...NULL, price DECIMAL(10, 2) NOT NULL, PRIMARY KEY (product_id) ); 在这个示例中,product_name和price列被定义为非空...A:是的,一个表可以有多个外键,每个外键都指向另一个表中的主键或唯一键。 Q:如果删除一个有外键约束的记录会怎样?
约束分类: ①非空约束 —— 限制该字段的数据不能为null NOT NULL ②唯一约束 —— 保证该字段的所有数据都是唯一、不重复的 UNIQUE ③主键约束—— 主键是一行数据的唯一标识,要求非空且唯一...外键约束 如何添加外键约束?: 方式一(在创建表时指定外键约束): CREATE TABLE 表名( 字段名 数据类型, ......外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名); 外键的删除/更新行为: NO ACTION:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除...,存在则将外键关联的字段值设置为null(前提是外键关联字段可以为null) SET DEFAULT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为一个默认值(Innodb...不支持) 添加外键约束时指定更新行为: ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名) ON UPDATE
外键将放在 users 表上。...自动为 accounts 表新增了 userId 字段,同时生成了相应的外键约束。...@gmail.com','2018-10-09 05:46:11','2018-10-09 05:46:11'); 该 SQL 语句会插入一条新的 account 记录,此时 userId 的值为空,还未关联...然后设置新的 account 的外键 userId 为当前 user 的 id,从而建立关系。...即通过将外键 userId 设置为 NULL,完成表关系的切除。
,但是上面明显没有写明外键,所以 sequelize 会推断外键在 IdCard 中为 personId,如果没有就会报错 [找不到 idCard.personId 这个字段] 自定义外键,在 IdCard...中的外键为 user_id 和 Person 表产生关联 Person.hasOne(IdCard, { foreignKey: 'user_id', }); 重命名 IdCard 表数据 在 Person...SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。...2、数据库自带外键约束 只要在数据库表中定义了两表关联的外键,那么当删除父表数据时,子表关联的数据也会被自动删除。...这个操作不需要经过 sequelize,完全从 数据库层面配置 下面就是添加外键的 sql 语句,给 comment 加上外键 user_id ,关联 person 表的id alter table `
自动为 notes 表新增了 userId 字段,同时生成了相应的外键约束。...一般来说,外键约束可能会导致一些性能问题。所以,建表时我们一般会去掉约束,同时给外键加一个索引(加速查询),但之后的数据的一致性就需要应用层来保证了。...','2018-10-10 07:53:26','2018-10-10 07:53:26'); 以上 SQL 执行后,会插入一条 note 数据,但此时该条记录的外键 userId 为空。...`='2018-10-10 08:12:49' WHERE `id` IN (1, 2) 将 note3、note4 记录的外键 userId 的值置为当前用户的 id,完成关系的建立: UPDATE...`userId` = 1; userId 为 1 的用户的所有 note 记录的外键 userId 置为 NULL,切断关系: UPDATE `notes` SET `userId`=NULL,`updatedAt
', { // id 自动创建 username: { // 去问档查看 type: DataTypes.STRING, // 约束是否为空...type: DataTypes.INTEGER, allowNull: false, defaultValue: 0, comment: '是否为管理员.../model/user_detail.model') User.belongsTo(关联表名也就是UserDetail,{foreignKey:'User表的外键也就是与UserDetail关联的user_id...',targetKey:'目标表的关联键也就是UserDetail的user_id'}) include:[{ model:UserDeatil, attributes:['email'] }] attributes...UserDeatil, as: 'UserDetail', // 这里为空 attributes: [],
这也适用于关联生成的外键. // 将自动设置所有属性的字段参数为下划线命名方式. // 不会覆盖已经定义的字段选项 // 这样 updatedAt 的字段名会是 updated_at underscored...可以设置外键foreignKey,但不能设置目标主键targetKey(设置了也无效),可用sourceKey代替。 // 一个Show有多个Car,即Show是主表,Car是副表。...Car默认外键:ShowTableIds // Show.hasMany(Car) // 将Car表设置别名xxx // Show.hasMany(Car, { as:'xxx' }) // 一个Show...Car指定外键:idc // Show.hasMany(Car, { foreignKey: 'idc' }) // 一个Show有多个Car,即Show是主表,Car是副表。...是主键表,Tag是外键表,Article_tag带多个Tag Tag.belongsTo(Article_tag) CURD 普通方式 创建 create await Article.create({
目录 1 表的约束 约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类: 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign...key 1.1 非空约束:not null 1)在创建表时添加约束: CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非空...以上仍然存在一个问题,当在员工表中输入不存的部门时,数据依然可以添加,不符合实际,因此,这里就可以通过使用外键约束来解决。 【概念】什么是外键约束?...外键,就是从表中与主表主键对应的那一列,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,从表可以是多方,被别人约束的表。 注意:外键可以为NULL,但是不能是不存在的外键值。 ?...; 3)在创建表后添加外键: ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 添加外键
在这张图里,用户处于中心地位:一个以用户为中心的订单,最基本的要素包括六大类: 用户表(users)字段包括地址,名字等。...商品(products):标题,价格,图片,描述,用户 购物车(carts):哪个用户的购物车(外键) 订单(orders):哪个用户下的单(外键) 购物车单个明细(cartItems...):关联有什么商品(外键),属于哪个购物车,商品数量数量 用户的订单明细(ohterIstems)哪个订单(外键),有什么商品,数量。...建表不需要考虑外键。 // users.js const Sequelize = require('sequelize'); const sequelize = require('.....price: 999, imageUrl: 'iphonex.jpg', description: '爱疯叉商品描述' }); 那么对应对关系(外键
Sequelize 为开发者提供了清晰易用的接口来定义关系、进行表之间的操作。本文我们将介绍在 Sequelize 中如何定义多对多的表关系。...UserProject' }); User.belongsToMany(Project, { through: 'UserProject' }); 这将创建一个名为 UserProject 的新模型,具有等效的外键...让我们通过使用别名(as)选项将 users 定义为 workers 而 projects 定义为 tasks。...我们还将手动定义要使用的外键: User.belongsToMany(Project, { as: 'Tasks', through: 'worker_tasks', foreignKey: 'userId...REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB; 可以看到,多对多关系中我们单独生成了一张关系表,并设置了 2 个外键
一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。 这种方案存在以下不足: 持久化层缺乏弹性。...二、引入sequelize 安装egg-sequelize 1 # 下载依赖,安装egg-sequelize和mysql27 2 npm install --save egg-sequelize mysql2...: 'egg-sequelize' 5 } 1 // config/config.default.js 2 config.sequelize = { 3 dialect: 'mysql...Students.associate = function () { 12 app.model.Students.belongsTo(app.model.Clazz, { //设置外键...13 foreignKey: 'clazz_id',//关联的外键 14 as: 'clazz'//将关联的数据显示到该字段上 15 }
{ this.loadAllImg(); goodStorage.set("imgList", this.imgList); } } // 判断图片列表是否为空...values(1,'童书'),(2,'电子书'),(3,'女装'),(4,'食品'),(5,'男装'),(6,'数码相机'),(7,'创意文具'),(8,'童装童鞋'); 二级分类 二级分类需要添加外键...社会科学',6),('艺术',6),('工具书',6),('教师用书',6),('考研',6),('公务员',6); 内连接 select * from 表A,表B where 表A.主键id=表B.外键...id select * from 表A inner join 表B on 表A.主键id=表B.外键id 左外连接 select * from 表A left outer join 表B on 表A.主键...id=表B.外键id 查询图书分类 根据一级分类 Id ,查询所有的二三级分类 async findCtgys(firstctgyId: string) { const sql = `select
MongoDB 开发 RESTful API 接口(Node.js + Express + MongoDB)如果你正在搭建后台管理工具,又不想处理前端问题,推荐使用卡拉云,卡拉云是新一代低代码开发工具,可一键接入常见数据库及...body-parser 用于解析请求并创建 req.body 对象cors 提供 Express 中间件corsOptions 这里设置了可访问后端的前端来源为 * ,这意味着任何前端都可以接入此后端。...= Sequelize;db.sequelize = sequelize;db.todos = require("....req.body.title) { res.status(400).send({ message: "内容不能为空" }); return; } // 创建一条清单 const...开发者完全不用处理任何前端问题,只需简单拖拽,即可快速生成所需组件,可一键接入常见数据库及 API,根据引导简单几步打通前后端,数周的开发时间,缩短至 1 小时。立即免费试用卡拉云。
indexRouter.get('/',(ctx, next)=>{ ctx.body = 'hello index' }) 注册中间件 把router和app关联起来,通过router.routes()方法去注册中间键。...// 或 Sequelize.UUIDV1} 然后再看一些常用参数 // 是否为空 allowNull: false, // 默认值 defaultValue: true // 主键 primaryKey...校验 合法性 首先是合法性,什么是合法 就是传过来的参数不为空。我们需要判断传过来的参数是否为空,那么写在哪个文件里?先写到controller。...解构出参数,判断它们如果为空,返回状态码 400,并在body中返回code码(自己定义),和错误信息。...所以在login的路由中新增 用户名和密码是否为空的校验 和 密码是否正确的校验。也就是 userValidator 和 verifyLogin。这两个方法我们写到中间件中。
模型创建,对数据的操作都建立在模型的基础上 const Sequelize = require('sequelize'); const sequelize = new Sequelize(database...,username,password,{ host:host, dialect:'mysql', }); const User = sequelize.define('userinfo...: Sequelize.STRING,//用户名 password: Sequelize.STRING,//密码 字符串 role: Sequelize.INTEGER,//权限 整数...freezeTableName为false表示该模型对应的表明就为userinfo表,默认时为true,对应表名为userinfos 增加数据 User.create({username...where: { username: username//查询条件 } }).then(result=>{ console.log(result)//空时为
本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 Node.js ORM 框架 sequelize 实践 最近在做积木系统2.0,这次使用的nodejs...web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.js,hapi-sequelize插件对sequelize做了很简单的封装...初始化 sequelize // server.js const Hapi = require('hapi'); const server = new Hapi.Server(); //注册到 hapi...type: DataTypes.STRING, //字段数据类型 allowNull: false //是否允许为空 }, user_level:...有可能无法满足你的需求,你可以编写自己的SQL语句: var sequelize = req.server.plugins['hapi-sequelize'].db.sequelize; sequelize.query
,让我们可以用OOP的方式操作数据库 npm install --save sequelize 新建 sequelize.js,建立连接池 const Sequelize = require('sequelize...以 tag.js 为例 model => tag.js const sequelize = require('...../sequelize ') const Sequelize = require('sequelize') const moment = require('moment') // 日期处理库 // 定义表结构...params.name) { ctx.body = { code: 1003, desc: '标签不能为空' } return false } try...routers 中的 index.js 调用了 app.use了,所以此处不需再引入 在浏览器里输入 localhost:3000/tag/list 就可以看到返回的数据结构了,只不过 data 为空数组
= require('sequelize') // const sequelize = new Sequelize('数据库名称', '用户名', '密码', { const sequelize =...max: 5, min: 0, acquire: 30000, idle: 10000 } }) //创建USER表,表结构为一个...Sequelize.STRING }, lastName: { type: Sequelize.STRING } }) cloud.init() exports.main...安装Sequelize的依赖 Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。...总结 个人比较推荐直接使用云开发自带的数据库,因为速度快,用外连MySQL的话会收到网络波动的影响。就像我要把这个云函数的超时时间跳到15s
领取专属 10元无门槛券
手把手带您无忧上云