联合唯一约束是一种数据库约束,用于确保一组字段的组合值在表中是唯一的。这意味着对于指定的字段组合,数据库中不能存在两行或更多行具有相同的值组合。
作用
-
数据完整性:确保数据的唯一性和一致性。
-
避免重复:防止插入重复的记录。
示例:联合唯一约束
以下是一个使用 Tortoise ORM 定义联合唯一约束的示例:
from tortoise import fields, models
class User(models.Model):
id = fields.IntField(pk=True, description="用户ID")
user_name = fields.CharField(max_length=20, description="用户名")
email = fields.CharField(max_length=255, description="邮箱")
created_at = fields.DatetimeField(auto_now_add=True, description="创建时间")
class Meta:
table = "users"
table_description = "用户表"
unique_together = [["user_name", "email"]] # 联合唯一约束
在这个例子中:
-
user_name
和email
字段的组合必须是唯一的。 -
如果尝试插入两条具有相同
user_name
和email
的记录,数据库会抛出错误。
应用场景
联合唯一约束通常用于以下场景:
-
用户名和邮箱组合唯一:确保每个用户名和邮箱的组合是唯一的。
-
订单中的商品和用户组合唯一:确保每个用户对某个商品只能有一个订单。
-
其他需要组合唯一性的场景:如课程和学生的组合唯一性。
验证约束
在代码中,你可以通过尝试插入重复的记录来验证联合唯一约束是否生效:
async def test_unique_together():
# 创建第一个用户
await User.create(user_name="john_doe", email="john@example.com")
# 尝试创建第二个用户,具有相同的 user_name 和 email
try:
await User.create(user_name="john_doe", email="john@example.com")
except Exception as e:
print(f"Error: {e}") # 输出:Error: UNIQUE constraint failed: users.user_name, users.email
总结
联合唯一约束是一种数据库约束,用于确保一组字段的组合值在表中是唯一的。它通过 unique_together
属性在 Tortoise ORM 中定义,可以有效防止插入重复的记录,从而保证数据的完整性和一致性。