MySQL(三)

ps:数据库的学习有“三建四句”,即建库、建表、建约束,以及数据库的CRUD(数据库的增删改查)。

一、约束

约束是作用于表中字段上的规则,用于限制存储在表中的数据。

建立约束的目的是保证数据库中数据的正确、有效性和完整性。约束是为了保证进入数据库的数据都是有效的、可靠的,会对列的值进行一些约束,确保存进去的数据都是有效的。

约束分为以下几类:

约束描述关键字
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
非空约束限制该字段的数据不能为NULLNOT NULL
条件约束(8.0.16版本之后有)保证字段满足某一条件CHECK
外键约束用来让两张表之间的数据建立连接,保证数据的一致性和完整性FOREIGN KEY

约束是建立在表和字段上的,可以在创建表和修改表的时候添加数据。

查看约束的代码为:

show create table 表名;

二、主键约束(PK)

主键约束最显著的特征是主键列中的值是不允许重复的,通过主键约束可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,且 PRIMARY KEY 约束中的列不能接受NULL值。

ALTER TABLE tab_name ADD CONSTRAINT pk_name PRIMARY KEY(字段名);

# 设置该字段为主键,主键约束名称为pk_name

1、设置主键约束的几种方式:

-- 1.创建表的时候指定主键约束

CREATE TABLE `table_name`  (

  `id` int PRIMARY KEY,-- 设置主键

   `name` varchar(20) , 

);

CREATE TABLE `table_name`  (

  `id` int,
   `name` varchar(20) ,
  PRIMARY KEY (`id`)  -- 设置主键

);

CREATE TABLE `table_name`  (

  `id` int,
   `name` varchar(20) ,
  constraint pk primary key(id)  -- 设置主键

);

   -- 2.修改某一列为主键

ALTER TABLE 表名称 ADD [CONSTRAINT] PRIMARY KEY(id);

ALTER TABLE 表名称 MODIFY [COLUMN] 字段名 属性 PRIMARY KEY; -- 修改列
类型

ALTER TABLE 表名称 CHANGE [COLUMN] 字段名 字段名 属性 PRIMARY KEY; -- 修改列名称和类型

2、删除主键约束:

ALTER TABLE 表名称 DROP PRIMARY KEY;

3、自增长列(标识列):

并不是所有表在设计完成后都能找到适合作为主键的列,为此数据库提供了自增长 列,自增长列是int类型的,其值是由数据库自动维护的,是永远都不会重复的,因此 自增长是最适合作为主键列的。在创建表时,通过 AUTO_INCREMENT 关键字来标识自 增长列,在MySQL数据库中自增长列必须是主键列。 特点:

  • 标识列必须和一个Key搭配(Key指主键、唯一、外键....)
  • 一个表最多有一个标识列
  • 标识列的类型只能是数值型
  • 标识列可以通过 SET auto_increment_increment = 3; 设置步长(全局,退 出数据库重新进入会恢复默认值),可以通过插入行时手动插入标识列值设置 起始值。
CREATE TABLE goods(

    no INT PRIMARY KEY AUTO_INCREMENT, -- 直接设置自增长

   name VARCHAR(10)
);

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 AUTO_INCREMENT; -- 修改为自增长列

ALTER TABLE 表名 CHANGE 列名 列名 列类型 AUTO_INCREMENT;

-- 删除自增长列

ALTER TABLE 表名 MODIFY [COLUMN] id int;

4、联合主键

联合主键(Composite Primary Key)是指在数据库表中,由多个列共同组成的主键, 用来唯一标识表中的每一行数据。它的作用类似于单一列的主键,但不是由单个列组 成,而是由多个列组合而成。联合主键可以确保表中的每一行都具有唯一性,并且每 个列组合的值都不会重复。 在创建表时,可以在列定义中指定多个列作为联合主键。

 

CREATE TABLE 表名 (

   列名1 数据类型,
   列名2 数据类型,
   列名3 数据类型,
    PRIMARY KEY (列名1, 列名2, 列名3)
);

-- 修改列的时候创建

ALTER TABLE 表名 ADD [CONSTRAINT] PRIMARY KEY (列名1, 列名2, 列名3);

-- 删除

ALTER TABLE 表名称 DROP PRIMARY KEY;

联合主键在以下情况非常有用:

  • 当单个列无法唯一标识表中的每一行,但多个列组合在一起可以唯一标识每一 行数据时。
  • 提高查询性能:联合主键可以更有效地支持涉及多个列的查询,避免创建额外的索引。
  • 在具有多个外键的关联表中,可以使用联合主键来确保外键引用的准确性。

ps:联合主键要求每个列组合的值都是唯一的.

三、唯一约束

对于非主键列中的值也要求唯一性时,就需要唯一约束

ps:唯一约束允许有多个 NULL 值

-- 创建表时

CREATE TABLE `table_name`  (

  `id` int,
   `name` varchar(20) UNIQUE # 唯一约束

);

CREATE TABLE `table_name`  (

  `id` int,
   `name` varchar(20),
    CONSTRAINT uq UNIQUE(name)   #唯一约束

);

-- 修改表

ALTER TABLE 表名 ADD UNIQUE(列名称);

ALTER TABLE 表名 ADD CONSTRAINT [constraint_name] UNIQUE(列名称);

ALTER TABLE 表名 CHANGE [COLUMN] 列名 列名 类型 UNIQUE;

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 UNIQUE;

-- 删除唯一约束

ALTER TABLE 表名称 DROP INDEX 设置唯一时的名称;

# 如果没有设置约束名称,名称默认是字段名

四、默认约束

为列中的值设置默认值, DEFAULT value

ps:如果已经设置了值,默认值就无效了

-- 创建表时

CREATE TABLE `table_name`  (

  `id` int DEFAULT value,
   `name` varchar(20) unique, 

);

-- 修改表

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 DEFAULT 默认值;

ALTER TABLE 表名 CHANGE 列名 列名 列类型 DEFAULT 默认值;

-- 删除

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型;

ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;

五、非空约束

ps:修改列的约束确保现有数据满足非空约束条件,否则可能导致操作失败。

-- 创建表时

CREATE TABLE `table_name`  (

  `id` int NOT NULL, # 非空约束

   `name` varchar(20), 

);

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 NOT NULL;

ALTER TABLE 表名 CHANGE 列名 列名 列类型 NOT NULL;

-- 删除

ALTER TABLE 表名 MODIFY [COLUMN] 列名 列类型 [null];

六、检查约束

从 MySQL 8.0.19 版本开始, MySQL 支持了检查约束。检查约束允许你在表定义中声 明条件,并确保符合该条件的数据才能插入或更新到相应的列中。

CREATE TABLE employees (

   id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(50),
   age INT,
   email VARCHAR(100),
    CHECK (age >= 18) -- 添加检查约束:年龄必须大于等于18

);

-- 修改表的时候

ALTER TABLE 表名 CHANGE 列名 列名 列类型 CHECK(condition);

ALTER TABLE 表名 MODIFY 列名 列类型 CHECK(condition);

ALTER TABLE 表名 ADD CONSTRAINT 列名 CHECK(condition);

-- 删除检查约束

ALTER TABLE 表名 DROP CONSTRAINT 约束名;

七、外键约束

用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 表中列的值来自于另外一张表的主键或唯一键的列称为外键 FK ,将被引用值的表称 为主表或父表,将引用值的表称为从表或子表。

-- 创建表时

CREATE TABLE `table_name`  (

  `id` int NOT NULL,
   `name` varchar(20),
    `rid` int,
 CONSTRAINT fk_a_b FOREIGN KEY(rid) REFERENCES b(id) 

);

ALTER TABLE 从表表名 ADD [CONSTRAINT] 约束名称 FOREIGN KEY (从表字段) 

REFERENCES 主表表名(主表字段);

ALTER TABLE goods ADD [CONSTRAINT] fk_category_no FOREIGN KEY 

(category_no) REFERENCES category(no);

-- 删除

ALTER TABLE 表名称 DROP FOREIGN KEY 索引名 ;# 设置外键时的名称
  • 外键列类型需要与引用列类型一致
  • 外键列的值必须是主表中引用列的值或者 NULL
  • 一个表可以有多个外键列
  • 从表列可以随便删除
  • 删除主表数据时,会先检查从表中有没有对此数据的关联,如果有就不能直接删除
  • 在设 置 外 键 的 时 候 后 面 添 加 on delete cascade / on update cascade 在删除/更新主表时,级联删除/更新外键列的数据
  • 在设置外键的时候后面添加 on delete set null / on update set null 在删除/更新主表时,外键列的值会变成null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值