首页 > 数据库 >mysql中主键、外键、约束、索引

mysql中主键、外键、约束、索引

时间:2024-05-21 14:07:28浏览次数:28  
标签:varchar PRIMARY 外键 主键 索引 KEY mysql NULL id

主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询。

1. 主键

是一种用于唯一标识表中每一行数据的标识符。在Mysql中,主键可以是一个或多个列的组合,但是必须满足以下条件:

  • 主键列的值必须唯一,不能重复。
  • 主键列的值不能为空,不能为NULL。
  • 一个表只能有一个主键。

主键可以用于加速查询和提高数据的完整性和安全性。在Mysql中,主键可以通过以下两种方式定义:

1.1. 在创建表时定义主键
在创建表时,可以通过在列定义后面添加PRIMARY KEY关键字来定义主键。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2. 在已有表中添加主键

在已有表中添加主键,可以使用ALTER TABLE语句

ALTER TABLE `users` ADD PRIMARY KEY (`id`);

2. 外键

外键是一种用于建立表与表之间关联关系的机制。外键可以用于保证数据的完整性和一致性。在Mysql中,外键可以通过以下两种方式定义:

2.1. 在创建表时定义外键

在创建表时,可以通过在列定义后面添加FOREIGN KEY关键字来定义外键。

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`),
  FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

orders表中的user_id和product_id列被定义为外键,分别引用了users表和products表中的id列。

2.2. 在已有表中添加外键

在已有表中添加外键,可以使用ALTER TABLE语句。

ALTER TABLE `orders` ADD FOREIGN KEY (`user_id`) REFERENCES `users`(`id`);

3. 约束

约束是一种用于限制表中数据的规则。在Mysql中,约束可以用于保证数据的完整性和一致性。Mysql支持以下几种约束:

3.1. NOT NULL约束

NOT NULL约束用于限制列中的数据不能为NULL。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

name和email列被定义为NOT NULL。

3.2. UNIQUE约束

UNIQUE约束用于限制列中的数据不能重复。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

email列被定义为UNIQUE。

3.3. CHECK约束

CHECK约束用于限制列中的数据必须满足指定的条件。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  CHECK (`age` >= 18),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

age列被定义为CHECK约束,要求age的值必须大于等于18。

3.4. DEFAULT约束

DEFAULT约束用于指定列的默认值。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

status列被定义为DEFAULT约束,如果插入数据时没有指定status的值,则默认为0。

4. 索引
索引是一种用于加速查询的机制。在Mysql中,索引可以用于提高查询效率和保证数据的完整性和一致性。Mysql支持以下几种索引:

4.1. PRIMARY KEY索引
PRIMARY KEY索引是一种用于唯一标识表中每一行数据的索引。在Mysql中,每个表只能有一个PRIMARY KEY索引。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

id列被定义为PRIMARY KEY索引。

4.2. UNIQUE索引

UNIQUE索引是一种用于限制列中的数据不能重复的索引。在Mysql中,每个表可以有多个UNIQUE索引。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

email列被定义为UNIQUE索引。

4.3. INDEX索引

INDEX索引是一种用于加速查询的索引。在Mysql中,每个表可以有多个INDEX索引。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  INDEX `idx_name` (`name`),
  INDEX `idx_email` (`email`),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

name和email列被定义为INDEX索引。

4.4. FULLTEXT索引

FULLTEXT索引是一种用于全文搜索的索引。在Mysql中,每个表只能有一个FULLTEXT索引。

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `content` text NOT NULL,
  FULLTEXT INDEX `idx_content` (`content`),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

content列被定义为FULLTEXT索引。


原文链接:https://blog.csdn.net/m0_63947499/article/details/131095865

 

标签:varchar,PRIMARY,外键,主键,索引,KEY,mysql,NULL,id
From: https://www.cnblogs.com/wangdch/p/18203886

相关文章

  • 在Docker中安装MySQL的ODBC驱动并添加Python测试代码
    #使用官方的Ubuntu镜像作为基础镜像FROMubuntu:20.04#设置环境变量以避免交互式安装提示ENVDEBIAN_FRONTEND=noninteractive#更新包列表并安装必要的软件包RUNapt-getupdate&&\  apt-getinstall-y\  build-essential\  curl\  apt-trans......
  • 创建你的-Mysql-数据库-全-
    创建你的Mysql数据库(全)原文:zh.annas-archive.org/md5/853FEC9D976A75004408D5A9A661EDD8译者:飞龙协议:CCBY-NC-SA4.0前言1995年发布的MySQL已成为最受欢迎的开源数据库系统。MySQL和phpMyAdmin的普及使得许多非IT专家能够使用MySQL后端构建动态网站。本书是一......
  • 二进制安装mysql5.7
    1.创建目录mkdir-p/server/toolsmkdir/applicationmkdir/mysql-data/mysql/data-p2.建用户与环境变量useradd-s/sbin/nologinmysqlecho"exportPATH=/application/mysql/bin:$PATH">>/etc/profilesource/etc/profile3.下载与解压文件cd/server/tools/wg......
  • SQL Server 触发器利用临时表在外检表插入前插入主键表
    在SQLServer中,你可以使用触发器(trigger)来在插入学生信息之前,根据班级名称在班级表中插入相应的班级记录。这通常涉及到两步:首先,检查班级表中是否已存在相应的班级;如果不存在,则插入;然后,允许插入学生记录。下面是一个示例,展示如何创建这样的触发器:假设你有两个表:Students 和 C......
  • MySQL 字段截取拼接
    @目录前言需求:拼接函数:截取函数:总结前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、提示:以下是本篇文章正文内容,下面案例可供参考需求:将数据库中的某一个字段的前6位替换成一个新的字符串,其它位置不变。拼接函数:CONCAT(A,B):将A和B拼接起来。截取函数:LEFT(s......
  • mysql允许其它机器连接
    1.修改MySQL的配置文件(windows是my.ini,linux是my.cn.cnf或my.cnf),如果有bind-address这一行,值改为0.0.0.0,这样可以允许任意IP地址连接到MySQL服务器。bind-address=0.0.0.0没有bind-address,就补上bind-address=0.0.0.0这一行2.修改权限grantallprivilegeson*.*to'r......
  • 阿里 Canal 实时同步 MySQL 增量数据至 ClickHouse 数据库
    主要实现思路1、在clickhouse中创建MySQL引擎表。2、根据MySQL引擎表的信息创建目标表。3、实现canal实时增量同步MySQL数据到clickhouse。MySQL的准备修改配置文件开启Binlog[root@hadoop100module]$sudovim/etc/my.cnfserver-id=1log-bin=mysql-binbinlog_form......
  • Mysql数据库安装卸载(windows)
    MySQL数据库环境准备MySQL下载、安装、配置、卸载、安装DBMS、使用DBMSMySQL版本及下载MySQL是Oracle的免费的关系型数据库,官网https://www.mysql.com/MySQL8.x新特性性能比5.7快支持NoSQL存储:5.7版本开始提供对NoSQL的支持,8.0.x作了改进窗口函数(新的查询方式)索引......
  • MySQL DDL
    创建数据库createdatabese<database_name>;createdatabase<database_name>ifnotexists;--如果不存在则创建createdatabase<database_name>charactersetutf8;--如果数据库需要支持中文,指定字符集创建utf8、GBKshowcreatedatabase<database_name>;--查看数......
  • MySQL数据类型
    数值类型tinyint-特小型整数(年龄)-1byte-范围有符号-128~127,无符号0~255smallint-小型整数-2byte(16bit)-范围有符号-32768~327670~65535mediumint-中型整数-3byte--2^31~2^31-10~2^32-1int/integer-整数型默认int-4bytebigint-大型整数,当in......