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

问题描述 投票:10回答:3

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

我想更新stage_name以使其默认值为

forename." ".surname

以便

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

会产生记录

'Stack'     'Overflow'    'Stack Overflow'

这可能吗?

谢谢 :)

sql mysql function default-value
3个回答
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

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

编辑:以下示例仅在stage_nameNULL时设置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 ,它将被保留。

10.1.4. Data Type Default Values

2
投票

根据CURRENT_TIMESTAMP不,你不能这样做。你只能使用常数或trigger

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


2
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.