唯一索引(Unique Index)是数据库中的一种索引类型,确保索引键上的每个值都是唯一的,即在该索引键上不会有重复的值。唯一索引通常用于确保数据完整性,比如在用户表中确保每个用户的电子邮件地址是唯一的。
唯一索引的特点
- 确保唯一性:唯一索引保证在索引键上没有重复的值。
- 提高查询性能:与普通索引一样,唯一索引也能提高查询性能。
- 数据完整性:通过唯一索引,可以强制执行数据唯一性约束,确保数据的完整性和一致性。
创建唯一索引的基本语法
在MongoDB中,可以通过 createIndex 方法创建唯一索引。语法如下:
javascript
db.collection.createIndex({ <field>: 1 }, { unique: true })
代码示例
以下是如何在不同编程语言和工具中创建和使用唯一索引的详细示例。
使用MongoDB Shell创建唯一索引
- 插入示例数据
javascript
use myDatabase;
db.users.drop(); // 删除现有的users集合(如果存在)
// 插入数据
db.users.insertMany([
{ name: "Alice", email: "alice@example.com" },
{ name: "Bob", email: "bob@example.com" }
])
- 创建唯一索引
javascript
// 在email字段上创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })
- 验证唯一索引
尝试插入重复的电子邮件地址,应该会失败:
javascript
db.users.insert({ name: "Charlie", email: "alice@example.com" })
你会得到一个错误提示,因为 email 字段的值必须是唯一的。
使用Node.js创建唯一索引
- 安装MongoDB Node.js驱动
在终端中运行以下命令来安装MongoDB的Node.js驱动:
bash
npm install mongodb
- 创建并运行Node.js脚本
创建一个新的Node.js脚本文件(如 uniqueIndex.js)并添加以下代码:
javascript
const { MongoClient } = require('mongodb');
async function main() {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useUnifiedTopology: true });
try {
// 连接到MongoDB服务器
await client.connect();
console.log("Connected to MongoDB");
// 选择数据库
const db = client.db('myDatabase');
// 选择集合
const collection = db.collection('users');
// 插入示例数据
await collection.insertMany([
{ name: "Alice", email: "alice@example.com" },
{ name: "Bob", email: "bob@example.com" }
]);
// 在email字段上创建唯一索引
await collection.createIndex({ email: 1 }, { unique: true });
console.log("Unique index created on 'email' field");
// 尝试插入重复的电子邮件地址
try {
await collection.insertOne({ name: "Charlie", email: "alice@example.com" });
} catch (e) {
console.error("Error inserting duplicate email:", e.message);
}
} finally {
// 关闭连接
await client.close();
}
}
main().catch(console.error);
运行这个脚本:
bash
node uniqueIndex.js
使用Python创建唯一索引
- 安装PyMongo
在终端中运行以下命令来安装PyMongo:
bash
pip install pymongo
- 创建并运行Python脚本
创建一个新的Python脚本文件(如 unique_index.py)并添加以下代码:
python
from pymongo import MongoClient, errors
def main():
client = MongoClient('mongodb://localhost:27017/')
db = client['myDatabase']
collection = db['users']
# 插入示例数据
collection.insert_many([
{ 'name': 'Alice', 'email': 'alice@example.com' },
{ 'name': 'Bob', 'email': 'bob@example.com' }
])
# 在email字段上创建唯一索引
collection.create_index([('email', 1)], unique=True)
print("Unique index created on 'email' field")
# 尝试插入重复的电子邮件地址
try:
collection.insert_one({ 'name': 'Charlie', 'email': 'alice@example.com' })
except errors.DuplicateKeyError as e:
print("Error inserting duplicate email:", e)
# 关闭连接
client.close()
if __name__ == '__main__':
main()
运行这个脚本:
bash
python unique_index.py
使用Java创建唯一索引
- 添加MongoDB Java驱动依赖
如果你使用的是Maven项目,添加以下依赖到你的 pom.xml 文件中:
xml
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.4.0</version>
</dependency>
- 创建Java类并添加代码
创建一个新的Java类文件(如 UniqueIndex.java)并添加以下代码:
java
import com.mongodb.MongoClient;
import com.mongodb.MongoWriteException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import static com.mongodb.client.model.Indexes.ascending;
import static com.mongodb.client.model.IndexOptions.*;
public class UniqueIndex {
public static void main(String[] args) {
// 连接到MongoDB服务器
MongoClient mongoClient = new MongoClient("localhost", 27017);
// 选择数据库
MongoDatabase database = mongoClient.getDatabase("myDatabase");
// 选择集合
MongoCollection<Document> collection = database.getCollection("users");
// 插入示例数据
collection.insertMany(Arrays.asList(
new Document("name", "Alice").append("email", "alice@example.com"),
new Document("name", "Bob").append("email", "bob@example.com")
));
// 在email字段上创建唯一索引
collection.createIndex(ascending("email"), new IndexOptions().unique(true));
System.out.println("Unique index created on 'email' field");
// 尝试插入重复的电子邮件地址
try {
collection.insertOne(new Document("name", "Charlie").append("email", "alice@example.com"));
} catch (MongoWriteException e) {
System.err.println("Error inserting duplicate email: " + e.getMessage());
}
// 关闭连接
mongoClient.close();
}
}
编译并运行这个Java类:
bash
javac -cp .:path/to/mongodb-driver-sync-4.4.0.jar UniqueIndex.java
java -cp .:path/to/mongodb-driver-sync-4.4.0.jar UniqueIndex
总结
唯一索引在数据库中确保索引键上的每个值都是唯一的,强制执行数据唯一性约束,确保数据的完整性和一致性。通过上述代码示例,你可以了解如何在MongoDB Shell、Node.js、Python和Java中创建和使用唯一索引,验证唯一约束在插入重复数据时的行为,并确保集合中的数据没有重复值。