我有一个看起来有点像这个演员的表(forename,surname,stage_name);
我想将stage_name更新为默认值
forename." ".surname
那样
insert into actors(forename, surname) values ('Stack', 'Overflow');
会产生记录
'Stack' 'Overflow' 'Stack Overflow'
这可能吗?
谢谢:)
答案 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是参考页。