update中的alias

 
    PostgreSQL中的update语句对alias的支持没有select中支持的完善,有个不大不小的问题。虽然不严重,但不知道的话还是会引起很大的困惑。
    首先看一下PostgreSQL对update的帮助:
  1. Command:     UPDATE
  2. Description: update rows of a table
  3. Syntax:
  4. UPDATE [ ONLY ] table [ [ AS ] alias ]
  5.     SET { column = { expression | DEFAULT } |
  6.           ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
  7.     [ FROM fromlist ]
  8.     [ WHERE condition | WHERE CURRENT OF cursor_name ]
  9.     [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
    可以看到在 UPDATE后可以通过 alias的方式指明需要更新的table的别名,于是我们很容易写出如下格式的update语句:
  1. update xuepeng.bb as b set b.a = 3 where a = 2;
    不幸的是,这样写是不能通过PostgreSQL的解析器的,会得到如下的错误提示:
  1. ERROR:  column "b" of relation "bb" does not exist
  2. LINE 1: update xuepeng.bb as b set b.a = 3 where a = 2;
    PostgreSQL的解析器把b.a = 3当成了bb的一个列的名称,很奇怪的行为。
    因此我们虽然使用了alias,但是在set的语句中还是不能使用这个别名的。有意思的是,在where的子语句中,却是能够正常使用alias。以下的语句是正确的:
  1. update xuepeng.bb as b set a = 3 where b.a = 2;
    PostgreSQL的版本是8.3, 不知道这个bug哪天能够修正好。






<think>我们正在讨论如何在CShell(csh)中定义和使用别名(alias)。根据之前对Bash中别名的讨论,现在需要针对CShell进行调整。CShell的别名语法与Bash类似,但有一些区别。在CShell中,别名定义的基本语法为:alias[别名][命令]注意:在CShell中,别名定义时不需要等号,而是直接使用空格分隔别名和命令。另外,如果命令中包含空格或特殊字符,需要使用单引号或双引号将整个命令括起来。具体步骤:1.定义临时别名(仅当前会话有效):在CShell提示符下直接输入:alias别名'命令'例如:aliasll'ls-l'aliasrm'rm-i'2.定义永久别名(重启后仍有效):需要将别名定义添加到CShell的配置文件中。对于CShell,配置文件通常是~/.cshrc(如果使用的是tcsh,也可以是~/.tcshrc)。使用文本编辑器打开配置文件:vi~/.cshrc或nano~/.cshrc在文件中添加别名定义,每行一个:aliasll'ls-l'aliasrm'rm-i'alias..'cd..'保存文件后,运行以下命令使配置立即生效:source~/.cshrc3.查看已定义的别名:在CShell中,只需输入`alias`命令即可列出所有别名。4.删除别名:使用`unalias`命令删除别名:unalias别名#删除单个unalias*#删除所有(注意:在csh中,使用`unalias*`删除所有别名)5.注意事项:-在CShell中,别名定义中的命令如果包含感叹号(!)等特殊字符,需要用单引号括起来,因为双引号在csh中不会阻止历史替换(historysubstitution)的展开。-别名不能直接接受参数。但是,我们可以通过使用`\!*`或`\!:1`等来代表参数。例如,我们想创建一个别名,用于搜索进程:aliaspsg'psaux|grep\!*'这样,当我们输入`psgbash`时,实际执行的是`psaux|grepbash`。其中,`\!*`表示所有的参数,`\!:1`表示第一个参数,`\!:2`表示第二个参数,以此类推。6.示例:-带参数的别名:aliasfindfile'find.-name\!*-print'使用:findfile"*.c"将会在当前目录及子目录中查找所有.c文件。-组合命令:aliasupdate'sudoaptupdate&&sudoaptupgrade'7.重要区别:-在Bash中,我们使用`aliasname='command'`,而在CShell中,我们使用`aliasname'command'`(注意没有等号)。-在Bash中,我们使用`\!`来引用参数,而CShell使用`\!*`等,但具体语法略有不同。8.验证当前Shell:在CShell中,我们可以通过`echo$shell`来查看当前使用的Shell(通常输出为/bin/csh或/bin/tcsh)。注意:CShell中别名定义中的引号是必须的,特别是当命令包含空格时。根据引用[3]提到的,我们可以使用`unalias`来删除别名,在CShell中同样适用。引用[4]中提到了内置命令alias和unalias,在CShell中它们也是内置命令。因此,总结CShell中别名的使用步骤:-打开配置文件(~/.cshrc或~/.tcshrc)-添加别名(使用单引号)-保存并source配置文件下面是一个配置文件的示例片段:```csh#~/.cshrc#别名定义aliashhistoryaliasll'ls-l'aliasla'ls-a'aliaslla'ls-la'alias..'cd..'alias...'cd../..'#带参数的别名aliaspsg'psaux|grep\!*'```注意:在CShell中,别名不支持函数(不像Bash可以通过函数来实现复杂别名),所以复杂操作可能需要编写脚本。如果用户使用的是tcsh(增强的CShell),语法与csh基本相同,但功能更多。配置文件可能是~/.tcshrc。相关问题:1.在CShell中,如何让别名在定义后立即生效?2.CShell的别名和Bash的别名有哪些主要区别?3.如何在CShell中创建带有重定向或管道的别名?4.如何解决CShell别名中参数引用的问题?5.在CShell脚本中可以使用别名吗?请注意:在CShell中,默认情况下,脚本中不会展开别名(除非设置了`setexpand_aliases`),所以通常脚本中不使用别名,而是使用完整的命令或脚本。参考引用:[^1]:CShell的别名语法与Bash不同,不需要等号。[^3]:使用unalias删除别名。[^4]:alias和unalias是内置命令。</think>### 在 C Shell (csh/tcsh) 中定义和使用 alias 命令 C Shell (csh) 和其增强版 tcsh 的别名语法与 Bash 有所不同,主要区别在于语法结构和参数处理方式。以下是详细使用方法: #### **1. 基本语法** ```csh alias [别名] '[命令]' # 定义别名 unalias [别名] # 删除别名 ``` #### **2. 定义临时别名 (当前会话有效)** ```csh alias ll 'ls -lh' # 简单命令 alias rm 'rm -i' # 带选项的命令 alias .. 'cd ..' # 目录操作 ``` #### **3. 定义永久别名** 添加到 C Shell 配置文件: - **csh/tcsh**:`~/.cshrc` 或 `~/.tcshrc` ```csh # 编辑配置文件 vi ~/.cshrc # 添加别名(注意:csh 不需要等号) alias gs "git status" alias ports "netstat -tulanp" alias update "sudo apt update && sudo apt upgrade" # 保存后加载配置 source ~/.cshrc ``` #### **4. 处理带参数的别名** C Shell 使用 `\!*` 表示所有参数,`\!:1` 表示第一个参数: ```csh alias psg "ps aux | grep \!*" # 搜索进程 alias findf "find . -name \!* -print" # 查找文件 alias mk "mkdir \!* && cd \!*" # 创建并进入目录 ``` #### **5. 查看和管理别名** ```csh alias # 查看所有别名 alias ll # 查看特定别名定义 unalias ll # 删除单个别名 unalias * # 删除所有别名 (csh 特有语法) ``` #### **6. 特殊字符处理** 使用反斜杠转义特殊字符: ```csh alias count "ls \!* | wc -l" # 统计文件数 ``` #### **7. 重要注意事项** 1. **语法差异**: - csh 使用空格分隔别名和命令,**不需要等号** `=` - 命令必须用**单引号或双引号**包裹 ```csh # 正确 alias ll "ls -l" # 错误(缺少引号) alias ll ls -l ``` 2. **参数引用**: - `\!*` 代表所有参数 - `\!:1` 代表第一个参数 - `\!:2` 代表第二个参数 3. **配置文件**: - 登录 Shell 加载 `~/.login` - 非登录 Shell 加载 `~/.cshrc` 4. **立即生效**: ```csh source ~/.cshrc # 重新加载配置 ``` #### **8. 完整示例** ```csh # ~/.cshrc 配置文件示例 alias h "history" # 历史命令 alias lla "ls -la | more" # 分页查看 alias c "clear" # 清屏 alias .. "cd .." # 上级目录 alias ... "cd ../.." # 上两级目录 alias cp "cp -iv" # 交互式复制 alias mv "mv -iv" # 交互式移动 alias grep "grep --color=auto" # 彩色grep alias du "du -h --max-depth=1 \!*" # 目录大小 ``` > ⚠️ **注意**:csh 的别名**不支持复杂函数**,如需高级功能建议使用脚本或切换到 Bash/zsh[^1][^2]。 --- ### 常见问题解答 **Q1: 别名在脚本中为何不生效?** A: csh 脚本默认不加载别名,需在脚本开头添加: ```csh #!/bin/csh -f source ~/.cshrc # 显式加载别名 ``` **Q2: 如何查看原始命令?** A: 使用 `which` 命令: ```csh which ll # 输出:ll: aliased to ls -lh ``` **Q3: 别名和脚本冲突怎么办?** A: 使用完整路径调用命令: ```csh /bin/ls # 忽略别名 ``` **Q4: 为什么带管道的别名报错?** A: 确保管道符在引号内: ```csh # 正确 alias psg "ps aux | grep" # 错误(管道在引号外) alias psg ps aux | grep ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值