使用 MySql 从 varchar 到枚举字段的外键约束
Foreign key constraint from varchar to enum field using MySql
假设我的 MySql 数据库中已有一个 table。这个 table 有一个定义如下的字段:
`field_a` enum('value_1', 'value_2', 'value_3')
现在我想用 field_b
定义另一个 table。由于外键约束,field_b
应该引用 field_a
。将 field_b
定义为精确的 enum
类型,如 field_a
接缝是多余的。有没有办法使 field_b
类型为 varchar
并仍然引用 enum
以确保只写入适当的 enum
的有效值?
据我所知,从理论和实践来看,现在不可能了。此外,official documentation 至 FOREIGN KEY
状态:
Corresponding columns in the foreign key and the referenced key must
have similar data types.
现在,虽然 ENUM
和 VARCHAR
都归类为 string types,但它们不被视为相似的数据类型。 (至少对于这个目的来说足够相似)。我通过实验发现与 ENUM
相似的数据类型中只有一种是 SET
。但即使在使用引用 ENUM
-to-ENUM
或 ENUM
-to-SET
父子 table 中的可能值列表的情况下必须相同。所以我怀疑即使您可以使用 VARCHAR,它也不会以任何方式帮助您检查或强制值的完整性。
我建议使用查找 table 而不是 ENUM
。它是更灵活的解决方案,并且您的 table 元数据中的冗余更少。
假设我的 MySql 数据库中已有一个 table。这个 table 有一个定义如下的字段:
`field_a` enum('value_1', 'value_2', 'value_3')
现在我想用 field_b
定义另一个 table。由于外键约束,field_b
应该引用 field_a
。将 field_b
定义为精确的 enum
类型,如 field_a
接缝是多余的。有没有办法使 field_b
类型为 varchar
并仍然引用 enum
以确保只写入适当的 enum
的有效值?
据我所知,从理论和实践来看,现在不可能了。此外,official documentation 至 FOREIGN KEY
状态:
Corresponding columns in the foreign key and the referenced key must have similar data types.
现在,虽然 ENUM
和 VARCHAR
都归类为 string types,但它们不被视为相似的数据类型。 (至少对于这个目的来说足够相似)。我通过实验发现与 ENUM
相似的数据类型中只有一种是 SET
。但即使在使用引用 ENUM
-to-ENUM
或 ENUM
-to-SET
父子 table 中的可能值列表的情况下必须相同。所以我怀疑即使您可以使用 VARCHAR,它也不会以任何方式帮助您检查或强制值的完整性。
我建议使用查找 table 而不是 ENUM
。它是更灵活的解决方案,并且您的 table 元数据中的冗余更少。