浏览代码

Fixed #18485 -- Doc'd behavior of PostgreSQL when manually setting AutoField.

François Freitag 7 年之前
父节点
当前提交
4f1eb64ad0
共有 2 个文件被更改,包括 30 次插入0 次删除
  1. 27 0
      docs/ref/databases.txt
  2. 3 0
      docs/ref/models/instances.txt

+ 27 - 0
docs/ref/databases.txt

@@ -224,6 +224,33 @@ live for the duration of the transaction.
 
 .. _pgBouncer: https://pgbouncer.github.io/
 
+.. _manually-specified-autoincrement-pk:
+
+Manually-specifying values of auto-incrementing primary keys
+------------------------------------------------------------
+
+Django uses PostgreSQL's `SERIAL data type`_ to store auto-incrementing primary
+keys. A ``SERIAL`` column is populated with values from a `sequence`_ that
+keeps track of the next available value. Manually assigning a value to an
+auto-incrementing field doesn't update the field's sequence, which might later
+cause a conflict. For example::
+
+    >>> from django.contrib.auth.models import User
+    >>> User.objects.create(username='alice', pk=1)
+    <User: alice>
+    >>> # The sequence hasn't been updated; its next value is 1.
+    >>> User.objects.create(username='bob')
+    ...
+    IntegrityError: duplicate key value violates unique constraint
+    "auth_user_pkey" DETAIL:  Key (id)=(1) already exists.
+
+If you need to specify such values, reset the sequence afterwards to avoid
+reusing a value that's already in the table. The :djadmin:`sqlsequencereset`
+management command generates the SQL statements to do that.
+
+.. _SERIAL data type: https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL
+.. _sequence: https://www.postgresql.org/docs/current/static/sql-createsequence.html
+
 Test database templates
 -----------------------
 

+ 3 - 0
docs/ref/models/instances.txt

@@ -426,6 +426,9 @@ happens.
 Explicitly specifying auto-primary-key values is mostly useful for bulk-saving
 objects, when you're confident you won't have primary-key collision.
 
+If you're using PostgreSQL, the sequence associated with the primary key might
+need to be updated; see :ref:`manually-specified-autoincrement-pk`.
+
 What happens when you save?
 ---------------------------