diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index 806c10af294..49c98967d50 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -1558,7 +1558,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 29649f6afd6..f88a03f821e 100644
--- a/doc/src/sgml/ref/delete.sgml
+++ b/doc/src/sgml/ref/delete.sgml
@@ -323,6 +323,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 40cca063946..b523766abe3 100644
--- a/doc/src/sgml/ref/update.sgml
+++ b/doc/src/sgml/ref/update.sgml
@@ -503,6 +503,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.