MySQL -将字段的默认值设置为字符串连接函数

bvuwiixz  于 2022-11-28  发布在  Mysql
关注(0)|答案(4)|浏览(185)

我有一个表,看起来有点像这个演员(名字,姓氏,stage_name);
我想更新stage_name的默认值为

forename." ".surname

因此,

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

会制作出唱片

'Stack'     'Overflow'    'Stack Overflow'

这可能吗?
谢谢你:)

u7up0aaq

u7up0aaq1#

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,因为将NULL与任何其他字符串连接会产生NULL。在每一列或连接的字符串中适当使用COALESCE()

**edit:**以下示例仅在NULLstage_name时才设置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
m1m5dgzv

m1m5dgzv2#

根据10.1.4. Data Type Default Values不行,你不能这样做.你只能用一个常量或CURRENT_TIMESTAMP
OTOH如果您是最新的,您可能会使用trigger来完成同样的事情。

u4vypkhs

u4vypkhs3#

我的第一个想法是,如果你在其他字段中有两个值,那么在第三个字段中冗余存储它们的迫切需要是什么呢?这与标准化和效率背道而驰。
如果您只想存储连接的值,那么您可以创建一个视图(或者IMSNHO更好的存储过程),将这些值连接到一个伪actor字段中,然后从视图/存储过程而不是直接从表中执行读取。
如果您绝对必须储存串连的值,您可以用两种方式行程:
1)使用存储过程而不是直接的SQL来执行插入操作。这样,您可以接收值并为要填充的字段构造值,然后构建插入语句,其中包括参与者字段的连接值。
2)所以我不会画太多的火焰,谨慎对待这个建议。只作为最后的手段使用。如果它为空,你可以通过添加一个触发器来构建值来破解这个行为。通常,触发器不是很好。它们会在相当简单的交互中添加看不见的成本和交互。但是,你可以,在插入或更新记录后,使用CREATE TRIGGER更新actors字段。Here是引用页。

2w3kk1z5

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));

我相信这应该能解决你的问题。

相关问题