mysq中的约束

约束

什么是约束?

约束对应的英语单词:counstraint

在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性。

约束的作用就是为了保证:表中的数据有效性。

约束包括那些
  • 非空约束:not null
  • 唯一性约束:unique
  • 主键约束:primary key(简称PK)
  • 外键约束:foreign key(简称FK)
  • 检查约束: check(mysql不支持,oracle支持)
非空约束:not null

非空约束not null 约束的字段不能为null。

create table t_user(
id int,
name varchar(255) not null//not null只有列级约束,没有表级约束
);
唯一性约束:unique

唯一性约束unique约束的字段不能重复,但是可以为null,多个null不算重复。

create table t_user(
id int,
name varchar(255) unique
);
新需求:name和email两个字段联合起来具有唯一性!!!
create table t_user(
id int,
name varchar(255) unique,//约束直接添加在列后面,叫做列级约束
email varchar(255) unique
);

这张表这样创建是不符合我以上“新需求的”。

这样创建表示:name具有唯一性,email具有唯一性。各自唯一。

//正确创建方式
//该方式实现name重复email不重复,或者name不重复email重复
create table t_user(
id int,
name varchar(255),
email varchar(255),
unique(name,email)//约束没有添加在列的后面,这种约束称为表级约束。
);
not null 和unique联合使用
create table t_user(
id int,
name varchar(255) not null unique
);

注意:在mysql中如果一个字段同时被not null 和 unique约束的话,该字段自动变为主键字段。(在oracle中不一样)

mysql> desc t_user;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int          | YES  |     | NULL    |       |
| name  | varchar(255) | NO   | PRI | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
主键约束
什么是主键?有什么用?

主键值是每一行记录的唯一标识。

主键值是每一行记录的身份证。

主键的特征:not null + unique(主键值不能是null,同时也不能重复);

任何一张表都应该有主键,没有主键表无效!!!

一张表主键约束只能添加一个

create table t_user(
id int primary key,//列级约束
name varchar(255)
);
create table t_user(
id int ,
name varchar(255),
primary key(id)//表级约束
);
表级约束主要是给多个字段联合起来添加约束
create table t_user(
id int ,
name varchar(255),
email varchar(255),
primary key(id,name)//id和name联合起来添加约束:复合主键!!!
);

在实际开发中不建议使用:复合主键,建议使用单一主键,因为主键值存在的意义就是这行记录的身份证,只要意义达到即可,单一主键可以做到,复合主键比较复杂,不建议使用!!!

主键值建议使用:

  • int

  • bigint

  • char

    等类型

    不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的。

主键除了:单一主键和复合主键外,还可以怎样进行分类?

自然主键:主键值是一个自然数,和业务没有关系。

业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键。

在实际开发中使用业务主键多,还是使用自然主键多一些?

自然主键使用比较多,因为主键只要做到不重复就行,不需要实际意义。

业务主键不好,因为主键一旦和业务挂钩,要么当业务发生变动的时候,可能会影响到主键,所以主键不建议使用,尽量使用自然主键。

在mysql中,有一种机制,可以帮助无名自动维护一个主键值
create table t_user(
id int primary key auto_increment,//auto_increment表示自增,从1开始,以1递增
name varchar(255),
email varchar(255)
);
外键约束(foreign key ,简称PK)

业务背景:

请设计数据库表,来描述“班级和学生”的信息?

t_class是父表

t_student是子表

create table t_class(
		classno int primary key,
		classname varchar(255),
);
create table t_student(
		no int primary key auto_incroement,
		name varchar(255),
		cno int,
		foreign key(cno) references t_class(classno) //外键cno引用t_class表的classno字段
);

删除上面表的顺序?

先删除子表,再删除父表。

创建表的顺序?

先创建父表,再创建子表

删除数据的顺序?

先删除子表数据,再删除父表数据。

插入数据的顺序?

先插入父表,再插入子表。

思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少具有unique约束

思考:外键可以为null吗?

外键值可以为null。

### MySQL 的远程访问权限设置 当尝试配置 MySQL 数据库以便允许远程连接时,可以通过更改用户的密规则实现这一目标。具体而言,将用户的认证插件更改为 `mysql_native_password` 是一种常见的方式[^1]。 以下是具体的 SQL 语句用于修改用户密码验证方式: ```sql ALTER USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; ``` 上述命令中的 `'your_username'@'%'` 示允许任何 IP 地址访问该账户。如果仅希望特定地址能够访问,则需替换 `%` 符号为实际的主机名或 IP 地址。 另外,在完成以上步骤之后还需要确认防火墙是否开放了 MySQL 默认端口 (3306),以及服务器上的 my.cnf 或 my.ini 文件中是否存在绑定本地回环地址 (`bind-address=127.0.0.1`) 的设定。如果有这样的限制则应将其移除或者调整成合适的网络接口地址。 ### 使用 SQL 进行数据管理和查询 SQL(Structured Query Language),即结构化查询语言,是一种专门用来处理关系型数据库的语言工具。它提供了丰富的功能集,涵盖了从基础的数据检索到复杂的事务控制等多个方面。在 MySQL 中利用 SQL 可执行如下几类主要任务:创建格、编辑现有格架构;向记录集中添新的条目或是删除已存在的项目;依据给定的标准筛选并提取所需的信息等操作均离不开这条强大的指令链路[^2]。 例如下面展示了一段简单的插入数据的例子: ```sql INSERT INTO employees (first_name, last_name, department_id) VALUES ('John', 'Doe', 5); ``` 这段脚本的作用是在名为employees的里新增一条员工资料,其中包含了名字(John Doe)及其所属部门编号(这里是5)[^2]。 ### 存储引擎与索引机制探讨 MySQL 支持不同的存储引擎选项,每种都有各自的特点和适用场景。比较常见的两种分别是 MyISAM 和 InnoDB 。前者擅长读密集型应用场合下的性能现优化工作;后者除了具备高并发写入能力之外还额外支持外键约束等功能特性[^3]。 关于索引部分,B+树形式最为普遍地被应用于大多数情况下作为默认选择之一。除此之外还有诸如哈希索引这样针对特殊需求设计出来的变体可供选用。至于到底哪些地方会存放这些元数据信息呢?一般来说,对于基于文件系统的实现来说,所有的数据连同相应的辅助性描述都会统一保存于指定目录之下。 ### 关系型 vs 非关系型数据库对比分析 最后值得一提的是,在当今大数据时代背景下出现了许多新型态别的持久层解决方案——也就是常说的各种 NoSQL 技术栈产品。它们之间最大的区别在于内部组织形态上存在本质差异。传统意义上的 RDBMS 像 Oracle Database , Microsoft SQL Server 等都是围绕着行列布局构建起来的整体框架体系;而像 MongoDB ,Cassandra 此类新兴力量则是采用了更灵活自由的形式去达实体间的关系模型[^4]。 尽管如此,无论如何演变发展,只要涉及到标准兼容层面的东西就始终绕不开那个经典的名字 —— Structured Query Language(SQL) [^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值