MySQL - 将字段的默认值设置为字符串连接函数

时间:2008-12-11 18:57:47

标签: sql mysql function default-value

我有一个看起来有点像这个演员的表(forename,surname,stage_name);

我想将stage_name更新为默认值

forename." ".surname

那样

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

会产生记录

'Stack'     'Overflow'    'Stack Overflow'

这可能吗?

谢谢:)

3 个答案:

答案 0 :(得分:14)

MySQL不支持列定义的DEFAULT选项中的计算列或表达式。

您可以在触发器中执行此操作(需要MySQL 5.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

在forename和surname中注意NULL,因为NULL与任何其他字符串的连接会产生NULL。根据需要在每列或连接字符串上使用COALESCE()

编辑:以下示例仅在stage_name时设置NULL。否则,您可以在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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

我的第一个想法是,如果你在其他领域有两个值,那么在第三个领域冗余存储它们的迫切需要是什么?它在正常化和效率方面飞得很快。

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

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

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

2)所以我不会画太多火焰,用小孩手套对待这个建议。仅作为最后的手段使用。如果将值保留为null,则可以通过添加触发器来构建值来破解此行为。通常,触发器并不好。它们为相当简单的交互添加了看不见的成本和交互。但是,您可以在插入或更新记录后使用CREATE TRIGGER更新actors字段。 Here是参考页。