2008-12-11 82 views
10

我有一张表,看起来有点像这个演员(forename,surname,stage_name);MySQL - 为字段设置字符串连接函数的默认值

我想更新stage_name拥有的

forename." ".surname 

默认值,以便

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

会产生记录

'Stack'  'Overflow' 'Stack Overflow' 

这可能吗?

谢谢:)

回答

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和姓氏,因为连接NULL与任何其他字符串连续产生NULL。根据需要在每列或连接字符串上使用COALESCE()

编辑:以下示例仅在NULL的情况下设置stage_name。否则,您可以在INSERT声明中指定stage_name,并将其保留。

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 
+0

我没有使用MySQL,但是将这个始终覆盖与级联值的列?如果你想让它作为默认值,你应该可以覆盖它,所以我认为你也需要在NEW.stage_name上合并。 – 2008-12-11 19:26:02

+0

@ bill-karwin我在`NEW.aka = CONCAT(NEW.fname,',NEW.lname)``上得到了一个语法错误`...看到我的完整命令[** here pastebin **](http ://pastebin.com/FiEUBgcu)...任何指针?? – mOrloff 2012-10-17 21:08:25

2

我首先想到的是,如果你在其他领域有两个值什么是冗余存储他们在第三场的迫切需要?它面对正常化和效率飞行。

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

如果你绝对必须存储连接的值,你可以用两种方式处理这个问题:

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

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

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