我可以将列的默认值设置为同一表中同一行上另一列的字符串吗?

Posted

技术标签:

【中文标题】我可以将列的默认值设置为同一表中同一行上另一列的字符串吗?【英文标题】:Can I set a column's default to be a character string from another column on the same row within the same table? 【发布时间】:2013-05-22 18:34:21 【问题描述】:

这是基本表布局:

create table employees (employeeid int not null IDENTITY, 
firstname varchar(50), middlename varchar(50), lastname varchar(50), 
assumedfirstname default(firstname), assumedname as concat(assumedfirstname,' ',lastname)

我了解在上述语句中未正确创建假定的名字列;默认值必须是标量表达式,不能是列名。 也就是说,上述声明清楚地说明了我的意图。也就是说,我希望假定的名字列自动填充在名字中找到的值,但允许稍后用单独的字符串显式替换。这样,假定的名字将始终代表人的名字和姓氏的默认值姓名或明确输入的假定名字及其姓氏。

因此,计算列在这种情况下将不起作用。

【问题讨论】:

如果您可以通过这种方式限制访问,则使用触发器或从存储过程填充它。默认值必须是文字,并且计算列不能更改。 【参考方案1】:

不能设为默认,但可以用触发器模拟;

CREATE TABLE employees (
  employeeid INT NOT NULL IDENTITY, 
  firstname VARCHAR(50), 
  middlename VARCHAR(50), 
  lastname VARCHAR(50), 
  assumedfirstname VARCHAR(50), 
  assumedname AS assumedfirstname + ' ' + lastname
);

CREATE TRIGGER MyTrigger on employees
FOR UPDATE, INSERT AS  
UPDATE e 
  SET e.assumedfirstname = COALESCE(e.assumedfirstname, i.firstname)
FROM employees e
JOIN inserted i
  ON i.employeeid=e.employeeid;

如果设置为 null(即未设置),此触发器会将假定的名字更新为名字的值。

An SQLfiddle to test with.

【讨论】:

好答案。我认为他只想要 INSERT 触发器(没有 UPDATE),因为他希望以后能够覆盖它。 @granadaCoder 谢谢 :) 更新触发器在那里,因此如果您将假定的名字设置回 null,它将再次用名字填充它。 但更新触发器永远不会允许多次更改假定的名字。我会小心这个逻辑。 @AaronBertrand 我不太清楚你说的只改变一次是什么意思; sqlfiddle.com/#!3/11008/4。你的意思是如果真实的名字改变了,假设的名字不会跟随? 如果表已经创建,我如何改变列作为 set假设名称 AS 假设名字 + ' ' + 姓氏

以上是关于我可以将列的默认值设置为同一表中同一行上另一列的字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427

如何将列的默认值设置为今天的日期? [复制]

使用同一表中另一列的数据计数更新一列? [关闭]

根据循环内另一列的值将列的值更改为nan

使用同一表中另一列的键更新 mysql 列

将列上的纪元时间保存到另一列 postgres