场景
表没有主键,且存在内容完全相同的多行数据:
| dept_id | name |
|---|---|
| 1001 | 张三 |
| 1001 | 张三 |
普通字段无法唯一定位某一行。
使用 ctid
ctid 是 PostgreSQL 的系统列,可以临时唯一定位当前行。
查询
sql
SELECT ctid, *
FROM employee;
结果:
text
ctid | dept_id | name
-------+---------+------
(0,1) | 1001 | 张三
(0,2) | 1001 | 张三
修改指定行
sql
UPDATE employee
SET name = '王五'
WHERE ctid = '(0,1)';
注意
ctid 是行的物理位置,可能随数据更新而变化。
适合临时处理重复或脏数据,不适合作为主键长期使用。