一、mysql 创建主键
MySQL 创建主键
MySQL 是一款常用的关系型数据库管理系统,用于存储和检索数据。在数据表设计中,主键是一项非常重要的概念。本文将介绍如何在 MySQL 中创建主键,以及主键的作用和好处。
什么是主键?
主键是用于唯一标识数据库表中每一条记录的一列(或者一组列)。它的值必须是唯一的,用于确保每条记录的唯一性和完整性。主键还可以用来快速查找和连接表中的数据。
为什么要创建主键?
创建主键有以下几个好处:
- 唯一性:主键的值必须是唯一的,确保每条记录的唯一性。
- 完整性:主键可以用于确保表中的每条记录都有一个唯一标识。
- 快速查找:主键可以用作快速查找表中的数据,提高数据库查询的效率。
- 连接表:主键还可以用于连接表,将多个表的数据关联起来。
如何创建主键?
在 MySQL 中,可以使用以下两种方法创建主键:
- 使用 CREATE TABLE 语句创建表时定义主键。
- 使用 ALTER TABLE 语句添加主键。
方法一:使用 CREATE TABLE 语句创建主键
在创建表时,可以在列的定义中指定主键。示例:
CREATE TABLE 表名 ( 列名 数据类型 PRIMARY KEY, 列名 数据类型, ... );在上面的语句中,将列名和数据类型的定义后面加上 PRIMARY KEY 关键字来设置主键。
方法二:使用 ALTER TABLE 语句添加主键
如果已经创建了表,可以使用 ALTER TABLE 语句来添加主键。示例:
ALTER TABLE 表名 ADD PRIMARY KEY (列名);在上面的语句中,使用 ADD PRIMARY KEY 关键字来添加主键。
注意事项:
- 一个表只能有一个主键。
- 主键的值不能为 NULL。
- 主键的值必须唯一。
- 主键可以由一列或多列组成,称为复合主键。
- 主键的列可以是数值型、字符型或日期型等。
主键的创建示例
下面是一个使用 CREATE TABLE 语句创建主键的示例:
CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(50), Age INT );在上面的示例中,StudentID 列被定义为主键,用于唯一标识每个学生的记录。
下面是一个使用 ALTER TABLE 语句添加主键的示例:
ALTER TABLE Students ADD PRIMARY KEY (StudentID);在上面的示例中,使用 ALTER TABLE 语句添加了一个主键。
总结
在数据库表设计中,主键起着非常重要的作用。它用于唯一标识每条记录,保证数据的完整性和一致性。通过创建主键,可以提高数据库的查询效率,并能够方便地连接多个表的数据。在 MySQL 中,可以使用 CREATE TABLE 或 ALTER TABLE 语句来创建主键。
希望本文对你了解 MySQL 中如何创建主键有所帮助。
二、mysql添加索引mysql如何创建索引?
在MySQL中,创建索引的方法有两种:使用命令行工具或者使用MySQL图形化工具。以下是两种方法的详细步骤:
方法一:使用命令行工具
1. 登录到MySQL服务器。在命令行中输入以下命令:
```css
mysql -u 用户名 -p
```
其中,用户名是您的MySQL用户名。执行此命令后,系统将提示您输入密码。
2. 选择要创建索引的数据库。使用以下命令选择要创建索引的数据库:
```perl
use 数据库名;
```
其中,数据库名是您要创建索引的数据库名称。
3. 创建索引。使用以下命令创建索引:
```sql
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
```
其中,表名是要添加索引的表名称,索引名是您为索引指定的名称,列名是要添加索引的列名称。
例如,如果您要在名为"users"的表的"email"列上创建一个名为"idx_email"的索引,可以使用以下命令:
```sql
ALTER TABLE users ADD INDEX idx_email (email);
```
方法二:使用MySQL图形化工具
1. 启动MySQL图形化工具(如phpMyAdmin或MySQL Workbench)。
2. 连接到您的MySQL服务器。输入服务器地址、用户名和密码。
3. 选择要创建索引的数据库和表。在图形化工具中,您可以通过单击数据库名称来选择它,然后选择您要创建索引的表。
4. 创建索引。在工具栏或右键菜单中,选择"Alter Table"(更改表)选项。在弹出的对话框中,选择要添加索引的列,并设置索引名称和其他选项。单击"Apply"(应用)按钮以创建索引。
5. 等待图形化工具完成操作。在操作完成后,您可以验证索引是否成功创建。您可以通过执行以下查询来检查是否已成功创建索引:
```sql
SHOW INDEX FROM 表名;
```
其中,表名是您要检查索引的表名称。
三、mysql怎么创建列表?
在mysql数据库中创建一张表的方法:
1.打开命令提示符,并登录数据库;
2.执行【create database 数据库名】命令创建数据库;
3.执行【create table表名称】命令创建数据表。
mysql创建表的方法:首先指定要在CREATE TABLE子句之后创建的表的名称;然后在【column_list】部分指定表的列表;最后需要为engine子句中的表指定存储引擎。
四、MySQL创建存储过程?
1、打开mysql的客户端管理软件,本文使用的是MySQL Workbench,打开之后连接上数据库。找到想要创建存储过程的数据库,在【Stored Procedures】菜单上点击鼠标右键,选择【Create Stored Procedure】菜单项。
2、点击之后,右侧会出现一个存储过程编辑界面,并且会有默认的创建存储过程的基本结构。
3、在CREATE PROCEDURE后面的是存储过程的名字,可以改成您喜欢的任何名字。
4、在存储过程名字后面有个括号,这里是放置存储过程的传入、传出参数的,当然存储过程也可以没有参数,保留一个空括号即可。
5、在存储过程的BEGIN...END之间书写存储过程的内容。使用【set 变量 =值;】给变量赋值。写完存储过程后,点击右下角的【Apply】按钮
1)注意每个语句结束,都必须用分号结尾
2)变量不需要@符号,这一点与sqlserver区别比较明显
3)书写存储过程中,左侧的叉叉符号,不用理会,等存储过程创建成功后,就不会有了。
6、在点击【Apply】按钮之后,会弹出一个确认框,此处继续点击【Apply】按钮,随后就会弹出一个【SQL script was successfully applied to the database】,表示存储过程创建完成,点击【Finish】按钮即可
7、调用存储过程使用call关键字,后面是存储过程的名称,括号中是传入的参数值。最后点击顶部的闪电符号,就可以执行存储过程,在下方显示存储过程返回的结果。
五、MySQL可以创建什么项目?
MySQL可以用于创建各种类型的项目,包括但不限于:网站、电子商务平台、博客、论坛、社交媒体应用、数据分析和报告系统等。
原因在于MySQL是一个功能强大且可靠的关系型数据库管理系统,提供高效的数据存储和检索能力,支持复杂的查询和事务处理。MySQL具有广泛的应用领域,适用于中小型项目和大型企业级应用,且易于安装和使用。它还具有良好的开源社区支持和丰富的生态系统,提供了许多工具和扩展,帮助开发者快速构建各种类型的应用。
六、Navicat如何创建mysql连接?
1.首先你电脑上必须安装了mysql的数据库。(如果你不清楚自己是否已经安装成功mysql,你可以在开始菜单输入“mysql”,进行搜索)
2.打开你的Navicat for Mysql (这里也可以使用上面的方法,在开始菜单搜索框中输入‘navicat’)
3.打开后单机工具栏左边第一个‘connection’,进入连接页面。
4.最重要的一步:打开的界面有五个框需要输入,第一个:connection Name 需要输入的是你新建的连接的的名字,这里我们就命名为‘本地’,第二个:
Host Name/Ip Address 你需要输入的是你本机的ip地址或者直接输入’localhost’,这里我们选择第二种。 第三个:Port ,输入你安装时候的端口号,一般为默认的3306;第四个和第五个分别为:UserName和Password,意思为你需要输入你数据库名用户名和密码,我的用户名是:root,密码:(保密,嘿嘿)。最后把下面那个‘Save Passwod’的小框框给勾上。
5.完成上面步骤,然后点击左下角有个‘Test Connectiion’如果弹出success,恭喜你直接点击右下角的‘save’按钮就可以了。如果弹出error ,你则需要再重新仔细查看自己哪里填错了。
6.点击‘save’后,你就可以双击“本地”(这里的‘本地’是你刚才输入的connection Name),然后打开你的数据库了。
七、Navicat for mysql如何创建表?
1、在本地创建数据库,首先把数据库运行环境启动,Apache与MySQL都显示绿色,表示环境开启成功,否则环境开启失败就无法操作数据库。
2、打开Navicat for MySql这个数据库管理工具,它是用来管理我们的数据库的创建,管理等操作,如下图所示:
3、打开Navicat for MySql之后,在左侧用鼠标右键,选择新建数据库。
4、进入创建数据库的页面,数据库名命名为myxiaoze;字符集填写utf8 -- UTF-8 Unicode;排序规则填写utf8_general_ci,填好之后点击确定:
5、在左侧右键刷新,就可以看到刚刚创建好的数据库,如下图所示:
6、双击打开刚刚创建好的数据库,点击表,在右边空白处右键,选择新建表,如图所示:
7、进入创建表的页面,接下来就是创建字段了,设置主键并且自动递增,自动递增的作用是,每增加一条数据,id就会自动增加,不需要我们输入。
8、同时按Ctrl+s保存数据表,并且填写数据表名,命名为xz。通过上面的步骤,我们就完美实现数据库的创建与数据表的创建。
八、如何在MySQL创建表?
1新建一个名为"createsql"的数据库,如下图所示。
2点击该数据库左侧的三角形图标,并显示其下面有四个列表项:表(Tables)和视图(Views)、存储过程(Stored Procedures)、函数(Functions),如下图所示。
3右击【表(Tables)】列表项,并在弹出的快捷菜单中选择【创建表(Create Tables)】菜单项,如下图所示。
4输入表名(Table Name)为“createtable”,创建数据项,并设置其属性,单击【应用(apply)】按钮,如下图所示。【解释说明】Table Name:表名Collation:字符集Column Name:列名Datatype:数据类型PK:主键NN:是否为空UQ:外键B:二进制UN:unsigned的英文缩称,无符号(非负数)ZF:zero fill的英文缩称,填充0,例如字段内容是1 int(4), 则内容显示为0001 AI:auto increment的英文缩称,自动增加G:生成列
5在弹出的【Apply SQL Script to Database】窗口中,可以看到创建表的SQL脚本,单击【应用(apply)】按钮,如下图所示。
6该窗口提示你可以执行SQL语句,单击【完成(Finsh)】按钮,如下图所示。
7创建完成后,可以看到Tables下名为"createtable"的表,如下图所示。
九、mysql如何添加/创建用户?
在MySQL中,可以使用SQL语句来添加/创建用户。语法如下:
sql
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
- username: 要创建的用户名
- host: 指定用户可以从哪个主机连接 MySQL,%表示可以从任何主机连接
- password: 该用户的登录密码
例如:
sql
# 创建用户test,密码为123456,可以从任何主机连接
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
十、mysql group by创建索引吗?
在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如:MySQL GROUP BY 可能负责查询执行时间 90% 还多。MySQL 执行 GROUP BY 时的主要复杂性是计算 GROUP BY 语句中的聚合函数。UDF 聚合函数是一个接一个地获得构成单个组的所有值。这样,它可以在移动到另一个组之前计算单个组的聚合函数值。当然,问题在于,在大多数情况下,源数据值不会被分组。来自各种组的值在处理期间彼此跟随。因此,我们需要一个特殊的步骤。
处理 MySQL GROUP BY让我们看看之前看过的同一张table: mysql> show create table tbl G *************************** 1. row *************************** Table: tbl Create Table: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `g` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=2340933 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
并且以不同方式执行相同的 GROUP BY 语句:
1、MySQL中 的 Index Ordered GROUP BY
mysql> select k, count(*) c from tbl group by k order by k limit 5;
+---+---+
| k | c |
+---+---+
| 2 | 3 |
| 4 | 1 |
| 5 | 2 |
| 8 | 1 |
| 9 | 1 |
+---+---+
5 rows in set (0.00 sec)
mysql> explain select k, count(*) c from tbl group by k order by k limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 5
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)
在这种情况下,我们在 GROUP BY 的列上有一个索引。这样,我们可以逐组扫描数据并动态执行 GROUP BY(低成本)。当我们使用 LIMIT 限制我们检索的组的数量或使用“覆盖索引”时,特别有效,因为顺序索引扫描是一种非常快速的操作。
如果您有少量组,并且没有覆盖索引,索引顺序扫描可能会导致大量 IO。所以这可能不是最优化的计划。
2、MySQL 中的外部排序 GROUP BY
mysql> explain select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using filesort
1 row in set, 1 warning (0.00 sec)
mysql> select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5;
+---+---+
| g | c |
+---+---+
| 0 | 1 |
| 1 | 2 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
+---+---+
5 rows in set (0.88 sec)
如果我们没有允许我们按组顺序扫描数据的索引,我们可以通过外部排序(在 MySQL 中也称为“filesort”)来获取数据。你可能会注意到我在这里使用 SQL_BIG_RESULT 提示来获得这个计划。没有它,MySQL 在这种情况下不会选择这个计划。
一般来说,MySQL 只有在我们拥有大量组时才更喜欢使用这个计划,因为在这种情况下,排序比拥有临时表更有效(我们将在下面讨论)。
3、MySQL中 的临时表 GROUP BY
mysql> explain select g, sum(g) s from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using temporary
1 row in set, 1 warning (0.00 sec)
mysql> select g, sum(g) s from tbl group by g order by null limit 5;
+---+------+
| g | s |
+---+------+
| 0 | 0 |
| 1 | 2 |
| 4 | 4 |
| 5 | 5 |
| 6 | 12 |
+---+------+
5 rows in set (7.75 sec)
在这种情况下,MySQL 也会进行全表扫描。但它不是运行额外的排序传递,而是创建一个临时表。此临时表每组包含一行,并且对于每个传入行,将更新相应组的值。很多更新!虽然这在内存中可能是合理的,但如果结果表太大以至于更新将导致大量磁盘 IO,则会变得非常昂贵。在这种情况下,外部分拣计划通常更好。请注意,虽然 MySQL 默认选择此计划用于此用例,但如果我们不提供任何提示,它几乎比我们使用 SQL_BIG_RESULT 提示的计划慢 10 倍 。您可能会注意到我在此查询中添加了“ ORDER BY NULL ”。这是为了向您展示“清理”临时表的唯一计划。没有它,我们得到这个计划: mysql> explain select g, sum(g) s from tbl group by g limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 998490 filtered: 100.00 Extra: Using temporary; Using filesort 1 row in set, 1 warning (0.00 sec)
在其中,我们获得了 temporary 和 filesort “两最糟糕的”提示。MySQL 5.7 总是返回按组顺序排序的 GROUP BY 结果,即使查询不需要它(这可能需要昂贵的额外排序传递)。ORDER BY NULL 表示应用程序不需要这个。您应该注意,在某些情况下 - 例如使用聚合函数访问不同表中的列的 JOIN 查询 - 使用 GROUP BY 的临时表可能是唯一的选择。
如果要强制 MySQL 使用为 GROUP BY 执行临时表的计划,可以使用 SQL_SMALL_RESULT 提示。
4、MySQL 中的索引基于跳过扫描的 GROUP BY前三个 GROUP BY 执行方法适用于所有聚合函数。然而,其中一些人有第四种方法。
mysql> explain select k,max(id) from tbl group by k G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 2
filtered: 100.00
Extra: Using index for group-by
1 row in set, 1 warning (0.00 sec)
mysql> select k,max(id) from tbl group by k;
+---+---------+
| k | max(id) |
+---+---------+
| 0 | 2340920 |
| 1 | 2340916 |
| 2 | 2340932 |
| 3 | 2340928 |
| 4 | 2340924 |
+---+---------+
5 rows in set (0.00 sec)
此方法仅适用于非常特殊的聚合函数:MIN() 和 MAX()。这些并不需要遍历组中的所有行来计算值。他们可以直接跳转到组中的最小或最大组值(如果有这样的索引)。如果索引仅建立在 (K) 列上,如何找到每个组的 MAX(ID) 值?这是一个 InnoDB 表。记住 InnoDB 表有效地将 PRIMARY KEY 附加到所有索引。(K) 变为 (K,ID),允许我们对此查询使用 Skip-Scan 优化。仅当每个组有大量行时才会启用此优化。否则,MySQL 更倾向于使用更传统的方法来执行此查询(如方法#1中详述的索引有序 GROUP BY)。虽然我们使用 MIN() / MAX() 聚合函数,但其他优化也适用于它们。例如,如果您有一个没有 GROUP BY 的聚合函数(实际上所有表都有一个组),MySQL 在统计分析阶段从索引中获取这些值,并避免在执行阶段完全读取表: mysql> explain select max(k) from tbl G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: NULL partitions: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL filtered: NULL Extra: Select tables optimized away 1 row in set, 1 warning (0.00 sec)
过滤和分组
我们已经研究了 MySQL 执行 GROUP BY 的四种方式。为简单起见,我在整个表上使用了 GROUP BY,没有应用过滤。当您有 WHERE 子句时,相同的概念适用: mysql> explain select g, sum(g) s from tbl where k>4 group by g order by NULL limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: range possible_keys: k key: k key_len: 4 ref: NULL rows: 1 filtered: 100.00 Extra: Using index condition; Using temporary 1 row in set, 1 warning (0.00 sec)
对于这种情况,我们使用K列上的范围进行数据过滤/查找,并在有临时表时执行 GROUP BY。在某些情况下,方法不会发生冲突。但是,在其他情况下,我们必须选择使用 GROUP BY 的一个索引或其他索引进行过滤:
mysql> alter table tbl add key(g);
Query OK, 0 rows affected (4.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain select g, sum(g) s from tbl where k>1 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k,g
key: g
key_len: 4
ref: NULL
rows: 16
filtered: 50.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql> explain select g, sum(g) s from tbl where k>4 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k,g
key: k
key_len: 4
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index condition; Using temporary; Using filesort
1 row in set, 1 warning (0.00 sec)
根据此查询中使用的特定常量,我们可以看到我们对 GROUP BY 使用索引顺序扫描(并从索引中“放弃”以解析 WHERE 子句),或者使用索引来解析 WHERE 子句(但使用临时表来解析 GROUP BY)。根据我的经验,这就是 MySQL GROUP BY 并不总是做出正确选择的地方。您可能需要使用 FORCE INDEX 以您希望的方式执行查询。
- 相关评论
- 我要评论
-