10

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

我想更新 stage_name 使其具有默认值

forename." ".surname

以便

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

会产生记录

'Stack'     'Overflow'    'Stack Overflow'

这可能吗?

谢谢 :)

4

3 回答 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名字和姓氏,因为 aNULL与任何其他字符串的连接会产生 a NULLCOALESCE()根据需要在每一列或连接的字符串上使用。

编辑:以下示例stage_name仅在NULL. 否则,您可以stage_nameINSERT语句中指定,它会被保留。

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
于 2008-12-11T19:03:56.743 回答
2

根据10.1.4。数据类型默认值不,你不能那样做。您只能使用常量或CURRENT_TIMESTAMP

OTOH,如果您是最新的,您可能可以使用触发器来完成同样的事情。

于 2008-12-11T19:01:57.120 回答
2

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

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

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

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

2)所以我不会画太多火焰,请谨慎对待这个建议。仅作为最后手段使用。如果它为空,您可以通过添加触发器来构建该值来破解此行为。一般来说,触发器并不好。它们将看不见的成本和交互添加到相当简单的交互中。但是,您可以在插入或更新记录后使用 CREATE TRIGGER 更新参与者字段。是参考页面。

于 2008-12-11T19:13:12.557 回答