MySQL 复合主键(Day02)

本文详细介绍了数据库中主键约束的概念,包括其规则、作用及创建方法,重点解析了复合主键的定义和使用场景,阐述了复合主键如何确保数据的唯一性和完整性。

主键约束

主键约束是表中的某一列,也可以是表中多个列所构成的一个组合,其中有多一个列组合而成的主键称为复合主键

在MsSQL中,主键列必须遵循以下规则:

1.每个表只能定义一个主键

2.唯一性原则,主键的值也成只为键值,必须能够唯一标识表中的每一条记录,且不能为NULL,也就是说一张表中两个不同的行

在主键上不能有相同的值。

3.最小化规则.复合主键不能包含不必要的多余列,也就是说,当从一个复合主键中删除一列后,如果剩下的列构成的主键仍能够满足唯一性原则,那么这个复合主键是不正确的。

4.一个列明在符合主键中只能出现一次。

 

有多一个列组合而成的主键称为复合主键

复合主键

什么是主键约束:(在一个数据表中通过多个字段作为主键来确定一条记录,那么,多个字段组成的就是复合主键 )

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(下文摘选自-作者:beautifulsarah ,应博主要求,转载请注明出处
来源:优快云 
原文:https://blog.youkuaiyun.com/beautifulsarah/article/details/53502109?utm_source=copy )

所谓的复合主键 就是指你表的主键含有一个以上的字段组成 
比如 
create table test 

   name varchar(19), 
   id number, 
   value varchar(10), 
   primary key (name,id) 
)

上面的name和id字段组合起来就是你test表的复合主键 
它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 
一般情况下,主键的字段长度和字段数目要越少越好
--------------------- 

为什么要使用主键约束:

(以下内容摘选自-作者:南极娃娃鱼 )应博主要求,转载请注明出处

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
来源:优快云 
原文:https://blog.youkuaiyun.com/wangyuchun_799/article/details/49329649?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

最近学习一点数据库的基本知识,被一个问题困惑了许久:主键是唯一的索引,那么为何一个表可以创建多个主键呢?

其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。

此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?

所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段啊哈哈,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。
--------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------

创建主键约束有两种方法:

1.create table tb_user(

id int auto_increment primary key,

user varchar (30)  not null,

createtime daretime);

方法二:

create table tb_student(

id int auto_increment,

name varchar(30) not null,

sex varchar(2),

classid int not null,

birthday date,

PRIMARY KEY(id,classid)

);

如果表中仅由表中的某一列所构成,那么以上两种方法均可定义主键约束,如果主键有表中多个列所构成,那么只能用第二种方法来定义主键约束,另外,定义主键约束后,MySQL会自动为主键创建一个唯一索引,默认名为primary,也可以修改其他的名字。

MySQL 中创建一个包含自增主键的表,通常需要使用 `AUTO_INCREMENT` 属性,并将该字段定义为 `PRIMARY KEY`。MySQL 要求自增字段必须是主键,或者至少是主键的一部分(例如在复合主键中)[^4]。 以下是一个典型的创建包含自增主键表的 SQL 语句示例: ```sql CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(15) NOT NULL ) AUTO_INCREMENT = 100; ``` 在这个示例中: - `id` 字段为自增主键,类型为 `INT UNSIGNED`,并设置为非空。 - `AUTO_INCREMENT PRIMARY KEY` 表示该字段既是主键又是自增字段。 - 可选的 `AUTO_INCREMENT = 100` 设置自增字段的初始值为 100,默认为 1。 如果希望使用复合主键,其中包含自增字段,则需要确保自增字段被包含在主键定义中,如下所示: ```sql CREATE TABLE tbl_stats ( f_id INT NOT NULL AUTO_INCREMENT COMMENT 'ID', f_province INT NOT NULL DEFAULT 0 COMMENT '省份', f_node VARCHAR(60) NOT NULL DEFAULT '' COMMENT '业务节点', f_day DATE NOT NULL DEFAULT '2008-01-01' COMMENT '日期', f_timesect INT NOT NULL DEFAULT 0 COMMENT '时间段(1-24)', f_failnum INT NOT NULL DEFAULT 0 COMMENT '失败次数', f_sucessnum INT NOT NULL DEFAULT 0 COMMENT '成功次数', f_avspeed INT NOT NULL DEFAULT 0 COMMENT '平均访问速度', PRIMARY KEY (f_day, f_id), KEY (f_province, f_node, f_timesect) ); ``` 在此示例中,`f_id` 是一个自增字段,并且是复合主键的一部分。需要注意的是,MySQL 允许自增字段作为复合主键的一部分,但必须确保主键的唯一性[^5]。 ### 设置自增起始值 可以使用 `ALTER TABLE` 命令来修改现有表的自增起始值: ```sql ALTER TABLE users AUTO_INCREMENT = 200; ``` 这将把 `users` 表中 `id` 字段的下一个自增值设置为 200。 ### 注意事项 - 自增字段必须被索引,通常是主键或唯一索引。 - 如果在创建表时未指定 `AUTO_INCREMENT` 的起始值,则默认从 1 开始。 - 使用复合主键时,需要特别注意主键的组合唯一性。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值