【问题标题】:Creating ENUM variable type in MySQL在 MySQL 中创建 ENUM 变量类型
【发布时间】:2010-11-30 13:19:03
【问题描述】:

我在 MySQL 中使用 ENUM 数据类型并希望重用它,但不重新键入值。在 MySQL 中是否有与 C、C++ 等价的定义类型的方式?

我想做以下事情:

DEFINE ETYPE ENUM('a','b','c','d');
CREATE TABLE Table_1 (item1 ETYPE, item2 ETYPE);

这可能吗?

谢谢

【问题讨论】:

    标签: mysql variables enums


    【解决方案1】:

    没有。 MySQL 不支持 CREATE DOMAINCREATE TYPE,例如 PostgreSQL does

    您可能需要再次输入所有名称。您可以通过使用复制和粘贴或 SQL 脚本来减轻执行此操作所需的工作量。

    您还可以使用 INFORMATION_SCHEMA 表来获取 ENUM 定义的文本,然后将其插入到新的 CREATE TABLE 语句中。

    您还可以创造性地使用CREATE TABLE AS 来复制类型定义。这是一个演示:

    CREATE TABLE foo ( f ENUM('abc', 'xyz') );
    CREATE TABLE bar AS SELECT f AS b FROM foo;
    SHOW CREATE TABLE bar;
    

    输出:

    CREATE TABLE `bar` (
      `b` enum('abc','xyz') default NULL
    ) 
    

    最后,我建议如果您的 ENUM 中有很多值(我猜这是真的,因为您正在寻找避免键入它们的解决方案),您可能应该使用查找表而不是 ENUM数据类型。


    来自@bliako 的回复:

    你可以按照你描述的方式做:

    CREATE TABLE bar (pop INT NOT NULL, name VARCHAR(100))
    AS SELECT 0 AS pop, NULL AS name, f FROM foo;
    

    我在 MySQL 5.7.27 上试过这个,它成功了。

    有趣的是,您不必在 CREATE TABLE 行中声明所有三列。第三列f会自动添加。

    有趣的是,我必须在SELECT 语句中提供列别名,以确保列名与CREATE TABLE 中声明的名称相匹配。否则,如果列名不匹配,您最终会得到额外的列,并且它们的数据类型不是您所期望的:

    create table bar (pop int not null, name varchar(100)) 
    as select 0 as c1, null as c2, f from foo;
    
    show create table bar\G
    
    CREATE TABLE `bar` (
      `pop` int(11) NOT NULL,
      `name` varchar(100) DEFAULT NULL,
      `c1` binary(0) DEFAULT NULL,
      `c2` binary(0) DEFAULT NULL,
      `f` enum('abc','xyz') DEFAULT NULL
    )
    

    【讨论】:

    • 太好了。我想知道如何在同一个表中将上述内容与临时列创建语句结合起来。像这样的东西? CREATE TABLE bar AS pop INT NOT NULL, name VARCHAR(100), SELECT f AS b FROM foo;
    【解决方案2】:

    下面给出 mysql db 的示例。

    CREATE TABLE `data` (
    `Id` int(11) NOT NULL AUTO_INCREMENT,
      `gender` enum('Male','Female') DEFAULT NULL,
    PRIMARY KEY (`Id`)
      ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
    COLLATE = utf8mb4_0900_ai_ci
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 2022-01-14
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2017-07-16
      相关资源
      最近更新 更多