代码之家  ›  专栏  ›  技术社区  ›  adam

mysql-将字段的默认值设置为字符串串联函数

  •  10
  • adam  · 技术社区  · 16 年前

    我有一张桌子看起来有点像这个演员(名字,姓氏,舞台名称);

    我要更新阶段名称,使其默认值为

    forename." ".surname
    

    以便

    insert into actors(forename, surname) values ('Stack', 'Overflow');
    

    会产生记录

    'Stack'     'Overflow'    'Stack Overflow'
    

    这有可能吗?

    谢谢)

    3 回复  |  直到 12 年前
        1
  •  14
  •   Bill Karwin    12 年前

    mysql不支持 DEFAULT 列定义的选项。

    您可以在触发器中执行此操作(需要MySQL5.0或更高版本):

    CREATE TRIGGER format_stage_name 
    BEFORE INSERT ON actors
    FOR EACH ROW
    BEGIN
      SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
    END
    

    您可能还希望创建类似的触发器 BEFORE UPDATE .

    当心 NULL 名字和姓氏,因为 无效的 使用任何其他字符串生成 无效的 . 使用 COALESCE() 在每列或连接字符串上(视情况而定)。

    编辑: 以下示例集 stage_name 只要它是 无效的 . 否则,可以指定 舞台名称 在你 INSERT 声明,它将被保存。

    CREATE TRIGGER format_stage_name 
    BEFORE INSERT ON actors
    FOR EACH ROW
    BEGIN
      IF (NEW.stage_name IS NULL) THEN
        SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
      END IF;
    END
    
        2
  •  2
  •   Greg    16 年前

    根据 10.1.4. Data Type Default Values 不,你不能那样做。只能使用常量或 CURRENT_TIMESTAMP .

    如果你是最新的,你可以用 trigger 完成同样的事情。

        3
  •  2
  •   Chris    16 年前

    我的第一个想法是,如果您在其他字段中有这两个值,那么在第三个字段中冗余存储它们的迫切需要是什么?它面临着规范化和效率化的挑战。

    如果只想存储连接的值,那么只需创建一个视图(或imsnho,甚至更好的存储过程),将值连接到伪 actor 字段并从视图/存储过程而不是直接从表中执行读取。

    如果必须存储连接的值,可以通过两种方式处理:

    1)使用存储过程进行插入,而不是直接执行SQL。通过这种方式,您可以接收值并为要填充的字段构造一个值,然后构建insert语句,其中包括actors字段的连接值。

    2)所以我不会引燃太多的火焰,用儿童手套来对待这个建议。只能作为最后手段使用。如果该值为空,则可以通过添加触发器来构造该值来黑客此行为。一般来说,触发器不好。它们为相当简单的交互添加了看不见的成本和交互。但是,您可以在插入或更新记录后使用创建触发器更新actors字段。以下是参考页面:

    http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html