mysql中的多主键

mysql中的多主键

2013年11月10日 23:57:54 DevonLiu02 阅读数 2274

最近在学习mysql的时候发现关于多主键的一个问题。
google中的一个结果得到说 主键 就是unique 和 not null的结合,但经过试验之后发现,在细节上,二者是有差异的。

假设这样一个情况:
一个用户表,用户ID和用户名都是唯一的。
也就是说,一个ID只能出现一次,用户名也是只能出现一次,那么这个时候可能的建表语句就是这样:

 

 
  1. CREATE TABLE `user` (

  2. `userid` SMALLINT UNSIGNED AUTO_INCREMENT,

  3. `username` CHAR(16) NOT NULL,

  4. `password` char(40) NOT NULL,

  5. PRIMARY KEY (`userid`, `username`)

  6. );

但是实际上,这样建出来的表不能实现我们的需求
插入以下数据将会是正常的
  

idusername
1mike
2mike
2alice


 




数据中可以看到, 表中同时存在了2个同样的id和2个同样的username 这并不是我们想要的
这种主键称为 联合主键, 联合主键就是由1个以上的字段构成的唯一标识.

这种主键通常用在多对多的关系表中, 例如

一位老师可以教多门课程, 一门课程可以由多个老师来授课. 那么这种情况就可以考虑使用联合主键,  设置 PRIMARY KEY (course_id, teach_id) 这样就可以保证数据不会冗余。在这种情况下插入相同的(course_id, teach_id) 将会出错

 

course_idteach_id
11
12
21
11 (错误)

 

   





那么回到一开始的问题,要怎样确保userid和username都唯一?

建表语句如下

 

 
  1. CREATE TABLE `user` (

  2. `userid` SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

  3. `username` CHAR(16) NOT NULL,

  4. `password` char(40) NOT NULL,

  5. UNIQUE(`username`)

  6. );



使用 unique语句来确保username的唯一性, 这样同时也保证了userid唯一性
小结: mysql中没有多主键,只有联合主键。也就是说不能够同时存在多个独立的primary key,但可以有多个unique.

<think> 我们被要求使用中文回答问题,并在回答后提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。 问题:MySQL 中设置主键 回答内容: 在MySQL中,主键(Primary Key)是用于唯一标识表中每一行记录的一列或一组列。主键必须包含唯一的值,且能包含NULL值。 设置主键的方法: 1. 在创建表时设置主键: 可以在列定义时直接设置主键,也可以在最后使用PRIMARY KEY关键字指定。 示例1(单列主键): ```sql CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, PRIMARY KEY (id) ); ``` 示例2(多列主键): ```sql CREATE TABLE order_items ( order_id INT NOT NULL, item_id INT NOT NULL, quantity INT, PRIMARY KEY (order_id, item_id) ); ``` 也可以在列定义时直接指定: ```sql CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL ); ``` 2. 修改现有表以添加主键: 如果表已经存在,可以使用ALTER TABLE语句添加主键。 ```sql ALTER TABLE users ADD PRIMARY KEY (id); ``` 注意:在添加主键之前,要确保该列(或列组合)的值是唯一的且没有NULL值。 3. 删除主键: 如果需要删除主键约束(注意:一个表只能有一个主键,所以需要指定具体的主键名称): ```sql ALTER TABLE users DROP PRIMARY KEY; ``` 4. 主键与自增(AUTO_INCREMENT): 通常,主键列会设置为自增,特别是当主键是单列整数类型时。这样每次入新记录时,主键值会自动递增。 注意事项: - 每个表只能有一个主键。 - 主键可以由多个列组成(复合主键),此时这些列的组合必须唯一,且每个列都允许为NULL。 - 主键列应该选择那些值经常更改的列。 相关问题: 我们需要根据上面的回答提出3-5个问题。 可能的提问方向: 1. 如何设置复合主键? 2. 主键和唯一索引有什么区别? 3. 如果表中已经有数据,添加主键时遇到重复值或NULL值怎么办? 4. 主键是否必须为自增列? 5. 删除主键后,表中的数据会怎样? 我们将提出3-5个问题,这里我们选择4个问题。 注意:第一行必须是“§§相关问题§§”,然后接着是问题列表,要换行分散。 格式: §§相关问题§§ 1. 在MySQL中,如何创建一个由多个列组成的复合主键? 2. 主键约束和唯一约束在MySQL中有什么主要区别? 3. 当向已存在的表中添加主键时,如果遇到重复值或NULL值应该如何处理? 4. 主键列是否必须使用自增(AUTO_INCREMENT)属性?为什么? 注意:问题数量在3到5个之间,这里我们选择了4个。 </think> 在 MySQL 中设置主键是通过 `PRIMARY KEY` 约束实现的,用于唯一标识表中的每一行数据。以下是具体方法: ### 1. **创建表时设置主键** ```sql -- 单列主键 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, -- 直接定义主键 username VARCHAR(50) NOT NULL ); -- 或多列复合主键 CREATE TABLE orders ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) -- 复合主键 ); ``` ### 2. **修改现有表添加主键** ```sql -- 添加单列主键(需确保列无重复值且非NULL) ALTER TABLE employees ADD PRIMARY KEY (employee_id); -- 添加复合主键 ALTER TABLE order_details ADD PRIMARY KEY (order_id, item_id); ``` ### 3. **主键要求** - 值必须唯一且允许 `NULL` - 每个表只能有一个主键(可以是单列或多列组合) - 主键通常搭配 `AUTO_INCREMENT` 实现自增(仅限整数类型) ### 4. **删除主键** ```sql ALTER TABLE table_name DROP PRIMARY KEY; ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值