我有一张桌子,看起来有点像这个演员(名字,姓氏,舞台名);
我想更新 stage_name 使其具有默认值
forename." ".surname
以便
insert into actors(forename, surname) values ('Stack', 'Overflow');
会产生记录
'Stack' 'Overflow' 'Stack Overflow'
这可能吗?
谢谢 :)
我有一张桌子,看起来有点像这个演员(名字,姓氏,舞台名);
我想更新 stage_name 使其具有默认值
forename." ".surname
以便
insert into actors(forename, surname) values ('Stack', 'Overflow');
会产生记录
'Stack' 'Overflow' 'Stack Overflow'
这可能吗?
谢谢 :)
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 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
根据10.1.4。数据类型默认值不,你不能那样做。您只能使用常量或CURRENT_TIMESTAMP
。
OTOH,如果您是最新的,您可能可以使用触发器来完成同样的事情。
我的第一个想法是,如果您在其他字段中有这两个值,那么将它们冗余存储在第三个字段中的迫切需要是什么?它违背了规范化和效率。
如果您只是想存储连接的值,那么您可以简单地创建一个视图(或者 IMSNHO 甚至更好的存储过程),将值连接到一个伪actor
字段中,并直接从视图/存储过程而不是表中执行读取。
如果您绝对必须存储连接的值,您可以通过两种方式处理:
1) 使用存储过程而不是直接 SQL 进行插入。通过这种方式,您可以接收值并为您希望填充的字段构造一个值,然后构建插入语句,包括actors 字段的连接值。
2)所以我不会画太多火焰,请谨慎对待这个建议。仅作为最后手段使用。如果它为空,您可以通过添加触发器来构建该值来破解此行为。一般来说,触发器并不好。它们将看不见的成本和交互添加到相当简单的交互中。但是,您可以在插入或更新记录后使用 CREATE TRIGGER 更新参与者字段。这是参考页面。