diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index a00e496798f..45aba211339 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1468,7 +1468,7 @@ CREATE TABLE circles (
locate the row version very quickly, a row's
ctid will change if it is
updated or moved by VACUUM FULL. Therefore
- ctid is useless as a long-term row
+ ctid should not be used as a row
identifier. A primary key should be used to identify logical rows.
diff --git a/doc/src/sgml/ref/delete.sgml b/doc/src/sgml/ref/delete.sgml
index 7717855bc9e..f61ecc7881b 100644
--- a/doc/src/sgml/ref/delete.sgml
+++ b/doc/src/sgml/ref/delete.sgml
@@ -285,6 +285,9 @@ DELETE FROM user_logs AS dl
USING delete_batch AS del
WHERE dl.ctid = del.ctid;
+ This use of ctid is only safe because
+ the query is repeatedly run, avoiding the problem of changed
+ ctids.
diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml
index 1c433bec2bb..456d03a0104 100644
--- a/doc/src/sgml/ref/update.sgml
+++ b/doc/src/sgml/ref/update.sgml
@@ -470,6 +470,9 @@ UPDATE work_item SET status = 'failed'
WHERE work_item.ctid = emr.ctid;
This command will need to be repeated until no rows remain to be updated.
+ (This use of ctid is only safe because
+ the query is repeatedly run, avoiding the problem of changed
+ ctids.)
Use of an ORDER BY clause allows the command to
prioritize which rows will be updated; it can also prevent deadlock
with other update operations if they use the same ordering.