我有一个表,看起来有点像这个演员(名字,姓氏,stage_name);我想更新stage_name的默认值为
forename." ".surname
因此,
insert into actors(forename, surname) values ('Stack', 'Overflow');
会制作出唱片
'Stack' 'Overflow' 'Stack Overflow'
这可能吗?谢谢你:)
u7up0aaq1#
MySQL不支持列定义的DEFAULT选项中的计算列或表达式。您可以在触发器中执行此操作(需要MySQL 5.0或更高版本):
DEFAULT
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()。
BEFORE UPDATE
NULL
COALESCE()
**edit:**以下示例仅在NULL为stage_name时才设置stage_name。否则,您可以在INSERT语句中指定stage_name,它将被保留。
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
m1m5dgzv2#
根据10.1.4. Data Type Default Values不行,你不能这样做.你只能用一个常量或CURRENT_TIMESTAMP。OTOH如果您是最新的,您可能会使用trigger来完成同样的事情。
CURRENT_TIMESTAMP
u4vypkhs3#
我的第一个想法是,如果你在其他字段中有两个值,那么在第三个字段中冗余存储它们的迫切需要是什么呢?这与标准化和效率背道而驰。如果您只想存储连接的值,那么您可以创建一个视图(或者IMSNHO更好的存储过程),将这些值连接到一个伪actor字段中,然后从视图/存储过程而不是直接从表中执行读取。如果您绝对必须储存串连的值,您可以用两种方式行程:1)使用存储过程而不是直接的SQL来执行插入操作。这样,您可以接收值并为要填充的字段构造值,然后构建插入语句,其中包括参与者字段的连接值。2)所以我不会画太多的火焰,谨慎对待这个建议。只作为最后的手段使用。如果它为空,你可以通过添加一个触发器来构建值来破解这个行为。通常,触发器不是很好。它们会在相当简单的交互中添加看不见的成本和交互。但是,你可以,在插入或更新记录后,使用CREATE TRIGGER更新actors字段。Here是引用页。
actor
2w3kk1z54#
从MySQL 8.0.13开始,您可以对可以是文字常量或表达式的列使用DEFAULT子句。如果要使用表达式then,只需将所需的表达式括在括号内。
(concat(forename," ",surname))
据我所知,有两种方法可以完成你正在尝试做的事情:(重要提示:请考虑在运行以下查询之前先备份表)1-将“stage_name”列全部删除,并创建一个具有DEFAULT约束条件的新列。
ALTER TABLE actors ADD COLUMN stage_name VARCHAR(20) DEFAULT (concat(forename," ",surname))
2-这将更新列“stage_name”中较新的条目,但不更新旧条目。
ALTER TABLE actors alter stage_name set DEFAULT (concat(forename," ",surname));
之后,如果您需要更新“stage_name”列中以前的值,则只需运行:
UPDATE actors SET stage_name=(concat(forename," ",surname));
我相信这应该能解决你的问题。
4条答案
按热度按时间u7up0aaq1#
MySQL不支持列定义的
DEFAULT
选项中的计算列或表达式。您可以在触发器中执行此操作(需要MySQL 5.0或更高版本):
您可能还想创建一个类似的触发器
BEFORE UPDATE
。注意名字和姓氏中的
NULL
,因为将NULL
与任何其他字符串连接会产生NULL
。在每一列或连接的字符串中适当使用COALESCE()
。**edit:**以下示例仅在
NULL
为stage_name
时才设置stage_name
。否则,您可以在INSERT
语句中指定stage_name
,它将被保留。m1m5dgzv2#
根据10.1.4. Data Type Default Values不行,你不能这样做.你只能用一个常量或
CURRENT_TIMESTAMP
。OTOH如果您是最新的,您可能会使用trigger来完成同样的事情。
u4vypkhs3#
我的第一个想法是,如果你在其他字段中有两个值,那么在第三个字段中冗余存储它们的迫切需要是什么呢?这与标准化和效率背道而驰。
如果您只想存储连接的值,那么您可以创建一个视图(或者IMSNHO更好的存储过程),将这些值连接到一个伪
actor
字段中,然后从视图/存储过程而不是直接从表中执行读取。如果您绝对必须储存串连的值,您可以用两种方式行程:
1)使用存储过程而不是直接的SQL来执行插入操作。这样,您可以接收值并为要填充的字段构造值,然后构建插入语句,其中包括参与者字段的连接值。
2)所以我不会画太多的火焰,谨慎对待这个建议。只作为最后的手段使用。如果它为空,你可以通过添加一个触发器来构建值来破解这个行为。通常,触发器不是很好。它们会在相当简单的交互中添加看不见的成本和交互。但是,你可以,在插入或更新记录后,使用CREATE TRIGGER更新actors字段。Here是引用页。
2w3kk1z54#
从MySQL 8.0.13开始,您可以对可以是文字常量或表达式的列使用DEFAULT子句。
如果要使用表达式then,只需将所需的表达式括在括号内。
据我所知,有两种方法可以完成你正在尝试做的事情:(重要提示:请考虑在运行以下查询之前先备份表)
1-将“stage_name”列全部删除,并创建一个具有DEFAULT约束条件的新列。
2-这将更新列“stage_name”中较新的条目,但不更新旧条目。
之后,如果您需要更新“stage_name”列中以前的值,则只需运行:
我相信这应该能解决你的问题。