我只是想知道,因为MySQL ENUMs本质上是和桌子绑在一起的,如果两张桌子的ENUM是一样的,他们该如何处理JOINs呢?它们是基于ENUM值还是基于字符串键(输入)加入的?
有关后续工作,请参阅MariaDB如何处理外键约束中使用的ENUM类型?。
发布于 2018-05-22 19:25:31
两个表不能有相同的ENUMs。MySQL假定所有ENUM键都是全局唯一的。
CREATE TABLE foo ( a ENUM ('A', 'B', 'C'), x int );
CREATE TABLE bar ( a ENUM ('A', 'C', 'D'), y int );
INSERT INTO foo ( a, x ) VALUES ('A',1), ('B',2), ('C',3);
INSERT INTO bar ( a, y ) VALUES ('A',4), ('C',5), ('D',6);
SELECT * FROM foo JOIN bar USING(a);
+------+------+------+
| a | x | y |
+------+------+------+
| A | 1 | 4 |
| C | 3 | 5 |
+------+------+------+因此,在这个上下文中,ENUM的值是键的字符串值。PostgreSQL将返回相同的结果,但是由于它具有实际的ENUM类型,所以连接中的比较是interger,它不必将ENUM解析为字符串,
CREATE TYPE myType AS ENUM ('A', 'B', 'C', 'D');
CREATE TABLE foo ( a myType, x int );
CREATE TABLE bar ( a myType, y int );
INSERT INTO foo ( a, x ) VALUES ('A',1), ('B',2), ('C',3);
INSERT INTO bar ( a, y ) VALUES ('A',4), ('C',5), ('D',6);
SELECT * FROM foo JOIN bar USING (a);
a | x | y
---+---+---
A | 1 | 4
C | 3 | 5如果foo和bar是MySQL在它的enum“类型”中要求的不同的D9类型,那么您就会遇到同样的问题,但是PostgreSQL根本不允许连接,因为它们是不同的类型。PostgreSQL也是不允许一种枚举类型引用不同的离散枚举类型类型,无需手动提供从一个枚举转到另一个枚举的方法。
https://dba.stackexchange.com/questions/207533
复制相似问题