MySQL创建用户表用户ID代码
前言我们在进行平台账号体系设计的时候,遇到这么一个需求:在平台注册的用户ID以n位的数字展现。乍一看,这个需求很简单,就一句话。但仔细思考后,发现这里面还是有很多地方需要思考的:用户ID是随机生成还是...
2024.11.20MySQL 的外键约束
注意,MySQL 的 InnoDB 表引擎才支持外键关联,MyISAM 不支持。MySQL 还支持手动打开或关闭外键约束:SET FOREIGN_KEY_CHECKS = 0/1;。
使用外键约束最大的好处在于 MySQL 帮助我们完成数据的一致性检查。当我们使用默认的外键类型 RESTRICT 时,在创建、修改或者删除记录时都会检查引用的合法性。
假设我们的数据库中包含 posts(id, author_id, content) 和 authors(id, name) 两张表,在执行如下所示的操作时都会触发数据库对外键的检查:
向 posts 表中插入数据时,检查 author_id 是否在 authors 表中存在;
修改 posts 表中的数据时,检查 author_id 是否在 authors 表中存在;
删除 authors 表中的数据时,检查 posts 中是否存在引用当前记录的外键;
作为专门用于管理数据的系统,数据库与应用服务相比能够更好地保证完整性,而上述的这些操作都是引入外键带来的额外工作,不过这也是数据库保证数据完整性的必要代价。上述的这些分析都是理论上的定性分析,我们其实可以简单地定量分析一下引入外键对性能的影响。
创建表时定义外键(References,参照)
在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:
[CONSTRAINT ] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES 主键列1 [,主键列2,…]示例:
# 部门表 tb_dept1(主表)CREATE TABLE tb_dept1(id INT(11) PRIMARY KEY,name VARCHAR(22) NOT NULL,location VARCHAR(50)) ENGINE=InnoDB DEFAULT CHARSET=gb2312;# 员工表 tb_emp6(从表),创建外键约束,让 deptId 作为外键关联到 tb_dept1 的主键 id。CREATE TABLE tb_emp6(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),salary FLOAT,CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)) ENGINE=InnoDB DEFAULT CHARSET=gb2312;NOTE:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。
以上语句执行成功之后,在表示 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。
查看主表的约束信息
MariaDB [test_db]> select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME=‘tb_dept1‘\G;*************************** 1. row ***************************CONSTRAINT_CATALOG: defCONSTRAINT_SCHEMA: test_dbCONSTRAINT_NAME: fk_emp_dept1TABLE_CATALOG: def TABLE_SCHEMA: test_dbTABLE_NAME: tb_emp6COLUMN_NAME: deptId ORDINAL_POSITION: 1POSITION_IN_UNIQUE_CONSTRAINT: 1REFERENCED_TABLE_SCHEMA: test_dbREFERENCED_TABLE_NAME: tb_dept1REFERENCED_COLUMN_NAME: id1 row in set (0.00 sec)修改原有表的外键约束外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
在修改数据表时添加外键约束的语法格式如下:
ALTER TABLE ADD CONSTRAINT FOREIGN KEY() REFERENCES ();示例:修改数据表 tb_emp2,将字段 deptId 设置为外键,与数据表 tb_dept1 的主键 id 进行关联。
# 创建 tb_emp2(从表)CREATE TABLE tb_emp2(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),salary FLOAT) ENGINE=InnoDB DEFAULT CHARSET=gb2312;MariaDB [test_db]> desc tb_emp2;+--------+-------------+------+-----+---------+-------+| Field| Type| Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id | int(11) | NO| PRI | NULL||| name| varchar(25) | YES| | NULL||| deptId | int(11) | YES| | NULL||| salary | float| YES| | NULL||+--------+-------------+------+-----+---------+-------+# 添加外键约束ALTER TABLE tb_emp2 ADD CONSTRAINT fk_tb_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id);MariaDB [test_db]> desc tb_emp2;+--------+-------------+------+-----+---------+-------+| Field| Type| Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id | int(11) | NO| PRI | NULL||| name| varchar(25) | YES| | NULL||| deptId | int(11) | YES| MUL | NULL||| salary | float| YES| | NULL||+--------+-------------+------+-----+---------+-------+MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G*************************** 1. row ***************************Table: tb_emp2Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(25) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`),CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=gb2312删除外键约束当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表之间的关联关系。
删除外键约束的语法格式如下所示:
ALTER TABLE drop FOREIGN KEY ;示例:删除数据表 tb_emp2 中的外键约束 fk_tb_dept1。
ALTER TABLE tb_emp2 drop FOREIGN KEY fk_tb_dept1;MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G*************************** 1. row ***************************Table: tb_emp2Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(25) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`)) ENGINE=InnoDB DEFAULT CHARSET=gb2312如果感觉小编写得不错,请素质三连:点赞+转发+关注。我会努力写出更好的作品分享给大家。更多JAVA进阶学习资料小编已打包好,可以关注私信找我领取哦
前言我们在进行平台账号体系设计的时候,遇到这么一个需求:在平台注册的用户ID以n位的数字展现。乍一看,这个需求很简单,就一句话。但仔细思考后,发现这里面还是有很多地方需要思考的:用户ID是随机生成还是...
2024.11.20作者:姚远专注于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6,5.7,8.0 OCP。现在鼎甲科技任技术顾问,为同事和客户提供数据库培训和技术支...
2024.11.21概述本文将指导您完成在 SSMS 中成功创建链接服务器以连接到 MySQL 数据库的所有必要步骤。本文分为三个部分:为 MySQL 安装ODBC驱动程序配置 ODBC 驱动程序以连接到 MySQL 数...
2024.11.23遵循RDBMS的最佳实践时,在设计数据库以创建和强制执行引用完整性时要始终使用主键,这是数据质量和正确的关系数据库设计的主要要求。在本教程中,我们提供有关主键及其功能的背景信息,并提供代码示例来说明该...
2024.11.22普通索引普通索引是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:创建索引,例如CREATE INDEX ON tablename (列的列表);修改表,例如ALTE...
2024.11.21