当前位置: 首页 > 知识库问答 >
问题:

mysql - 如何约束entity中的属性只能是特定的某些值?

萧辰沛
2024-09-18

如题,比如gender,只能是男/女/未知,比如状态,只能是0/1,这个要如何约束?是在Java层面约束还是mysql层面约束?

共有2个答案

殷宇
2024-09-18

一般代码层面和数据库层面都要约束。

杨雪松
2024-09-18

在约束实体(Entity)中的属性只能为特定值时,可以从两个层面进行考虑:Java层面和数据库(如MySQL)层面。每种方式都有其适用场景和优缺点。

Java层面约束

在Java层面,你可以通过枚举(Enum)类型来约束属性只能为特定的几个值。枚举是Java中一种特殊的类,它用于表示一组固定的常量。

示例代码

public enum Gender {
    MALE, FEMALE, UNKNOWN
}

public class Person {
    private String name;
    private Gender gender; // 使用枚举来限制gender的取值

    // 构造器、getter和setter略
}

通过这种方式,你可以在Java代码中确保gender属性的值只能是MALEFEMALEUNKNOWN中的一个。这种约束是编译时检查,有助于提前发现错误。

MySQL层面约束

在MySQL层面,你可以使用ENUM类型或者CHECK约束(MySQL 8.0.16及以上版本支持)来限制列的值。

ENUM类型

CREATE TABLE people (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    gender ENUM('male', 'female', 'unknown') NOT NULL
);

使用ENUM类型,你可以直接在数据库层面限制gender列只能接受指定的几个字符串值。

CHECK约束(对于更复杂的逻辑或数值范围):

CREATE TABLE statuses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status_code INT NOT NULL,
    CONSTRAINT chk_status_code CHECK (status_code IN (0, 1))
);

CHECK约束允许你定义更复杂的条件来限制列的值。注意,CHECK约束是在MySQL 8.0.16及以上版本中引入的。

选择哪个层面?

  • Java层面:如果你的应用逻辑非常依赖于这些特定的值(比如需要根据不同的枚举值执行不同的逻辑),那么在Java层面使用枚举会更合适。它提供了类型安全,并且便于在Java代码中直接引用这些值。
  • MySQL层面:如果你希望数据库能够直接强制执行这些约束(比如,即使在应用程序逻辑出错的情况下),或者你想要利用数据库的能力来优化查询(比如,对于ENUM类型,MySQL可以更有效地存储和查询这些值),那么在数据库层面进行约束会更合适。

在实际应用中,通常建议同时在Java和数据库层面进行约束,以提供更强的数据完整性和安全性。

 类似资料:
  • Json.net有没有办法只指定你想要序列化的属性?或者根据绑定标志序列化某些属性,比如只声明? 现在我正在使用< code > JObject。FromObject(MainObj。SubObj);要获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例: 如果是,它将序列化A和B,但如果是,它将仅序列化B和C并忽略父属性

  • 我记得有一个数据结构保证某个字符串只能接收特定的值,它的工作原理就像一个接口什么的。我不记得这个数据结构的确切名称,也不容易找到它。 让我试着解释一下上下文。 假设我有一个名为 Foo 的类,其中包含参数位置。 如果我分配值顶部、底部或中间的位置,位置将被接受。如果我分配另一个值,它将引发异常。 我知道我可以做一个简单的if else或switch并抛出一个异常,但是我想找到这个特定的数据结构。

  • 问题内容: 在MySQL中创建非NULL约束以使fieldA和fieldB不能都为NULL的最佳方法是什么。我不在乎任何一个本身是否为NULL,只要另一个字段具有非NULL值即可。而且,如果它们都具有非NULL值,那就更好了。 问题答案: MySQL 5.5引入了SIGNAL,因此我们不再需要Bill Karwin的答案中的额外列。Bill指出您还需要一个更新触发器,因此我也将其包括在内。

  • 我有麻烦了。 我的MYsql数据库中有一个名为issuebook的表,其中有5列。 这些列是:memberid,membername,bookname,issuedate,ReturnDate。 因此,我只想在memberid、membername、bookname中的3列中插入数据,而其他2列暂时留空(因为在这些列中,当admin给出日期时,数据将插入这些列中)。 但每当我尝试插入它时,它会显示

  • 比方上面的类型,如果我想要 value 的类型在type为 'string' 时为 string ,在 type 为 'number' 的时候为 number。 要怎么定义这两个属性之间的类型约束?

  • 我有这样的情况: 由于项目经理之间存在关系m:n,我将有第三个表: 其中(ManagerID,ProjectID)是Manager_has_Project的复合主键 让我们假设我们必须删除一个从我们的数据库中创建了一些项目的经理:SQL不会让我们这么做。我们可以在子表“on DELETE cascade”中添加对fk ManagerID的约束,但在这种情况下,我们将丢失有关(例如)有多少经理为一个