MySQL联合主键设定
时间: 2024-07-15 16:00:40 浏览: 85
MySQL中的联合主键(Composite Primary Key)是指由两个或更多列组合而成的主键,每个列都对数据表中的唯一性有所贡献。这种设置对于那些具有自然关联的列,或者需要基于多个字段来唯一标识记录的情况非常有用。
以下是关于MySQL联合主键的一些关键点:
1. **定义联合主键**:在创建表时,使用`PRIMARY KEY`关键字后跟随列名列表来指定联合主键,例如:`ALTER TABLE table_name ADD PRIMARY KEY (column1, column2);`
2. **唯一性约束**:联合主键中的每个列单独都必须是唯一的,但组合在一起时必须是唯一的,即没有两行数据拥有相同的值组合。
3. **数据完整性**:联合主键保证了数据的一致性和完整性,因为表中不会有两个相同的键值。
4. **插入和更新**:当插入或更新一条记录时,所有联合主键列的值都需要同时存在,且满足唯一性。
5. **索引优化**:MySQL会自动为联合主键创建一个B树索引,提高查询效率。
相关问题
MySQL要求(1)对schooldb数据库course表“课程名”列上的前3个字符建立一个升序索引 I_kc。 (2)在class表的“院系”列和“年级”列上建立一个复合索引I_cx。(3)在student表的“姓名”列上创建一个唯一性索引。 (4)为course表(假设class表中主键未设定)创建主键索引,以提高表的检索速度。(5)创建score表带有“学号”“课程号”的联合主键,并在“成绩”列上创建普通 索引。 (6)删除course表上的主键。 2.分区 将course表的数据按“学分”进行KEY分区,共分为4个分区。
好的,针对您的问题,我会逐一回答:
1. 对schooldb数据库course表“课程名”列上的前3个字符建立一个升序索引 I_kc。
您可以使用以下SQL语句来创建该索引:
```
CREATE INDEX I_kc ON course(LEFT(课程名, 3));
```
2. 在class表的“院系”列和“年级”列上建立一个复合索引I_cx。
您可以使用以下SQL语句来创建该索引:
```
CREATE INDEX I_cx ON class(院系, 年级);
```
3. 在student表的“姓名”列上创建一个唯一性索引。
您可以使用以下SQL语句来创建该索引:
```
CREATE UNIQUE INDEX idx_student_name ON student(姓名);
```
4. 为course表(假设class表中主键未设定)创建主键索引,以提高表的检索速度。
您可以使用以下SQL语句来创建该索引:
```
ALTER TABLE course ADD PRIMARY KEY (课程号);
```
5. 创建score表带有“学号”“课程号”的联合主键,并在“成绩”列上创建普通索引。
您可以使用以下SQL语句来创建该索引:
```
ALTER TABLE score ADD PRIMARY KEY (学号, 课程号);
CREATE INDEX idx_score ON score(成绩);
```
6. 删除course表上的主键。
您可以使用以下SQL语句来删除该主键:
```
ALTER TABLE course DROP PRIMARY KEY;
```
2. 分区
将course表的数据按“学分”进行KEY分区,共分为4个分区,您可以使用以下SQL语句来实现:
```
ALTER TABLE course PARTITION BY KEY(学分) PARTITIONS 4;
```
MySQL的UNIQUE
### MySQL UNIQUE 约束的用法和特性
#### 创建带有唯一约束的数据表
在定义数据表时可以通过 `CREATE TABLE` 语句来指定列上的唯一性限制。这能确保该列中的所有值都是唯一的,不允许重复。
```sql
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (id),
UNIQUE (username), -- 单一列上设置唯一键
UNIQUE idx_email_unique (email) -- 多个列组合成复合唯一索引
);
```
上述例子中不仅设置了单个字段作为唯一键还展示了如何通过命名的方式创建多字段组成的联合唯一键[^1]。
#### 添加或删除现有表格里的唯一约束
对于已经存在的数据库对象也可以利用 `ALTER TABLE` 来增加新的唯一条件或是移除旧有的设定:
- **添加唯一约束**
```sql
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(column_list);
```
- **删除唯一约束**
```sql
ALTER TABLE table_name DROP INDEX index_name;
```
这里需要注意的是当执行删除操作时所使用的关键词是 `DROP INDEX` 而不是直接针对约束本身进行处理[^2]。
#### 唯一键的特点总结
- 每张表可以拥有多个唯一键;
- 主键本质上也是一种特殊的唯一键只不过它同时还具有非空性质;
- 如果指定了包含可为空(`NULL`) 的列为唯一,则允许存在任意数量的实际存储为null的情况因为它们被认为不相等;
- 当涉及到跨多列形成的复杂唯一规则时,只要有一部分匹配就会违反这条规定从而阻止新记录被插入到系统当中去;
阅读全文