Browse Source

Refs #30511 -- Updated docs about auto-incrementing primary keys on PostgreSQL.

Follow up to 2eea361eff58dd98c409c5227064b901f41bd0d6.
Mariusz Felisiak 2 years ago
parent
commit
081871bc20

+ 7 - 7
docs/intro/tutorial02.txt

@@ -274,7 +274,7 @@ readability):
     -- Create model Question
     --
     CREATE TABLE "polls_question" (
-        "id" serial NOT NULL PRIMARY KEY,
+        "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         "question_text" varchar(200) NOT NULL,
         "pub_date" timestamp with time zone NOT NULL
     );
@@ -282,10 +282,10 @@ readability):
     -- Create model Choice
     --
     CREATE TABLE "polls_choice" (
-        "id" serial NOT NULL PRIMARY KEY,
+        "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         "choice_text" varchar(200) NOT NULL,
         "votes" integer NOT NULL,
-        "question_id" integer NOT NULL
+        "question_id" bigint NOT NULL
     );
     ALTER TABLE "polls_choice"
       ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
@@ -315,10 +315,10 @@ Note the following:
   PostgreSQL to not enforce the foreign key until the end of the transaction.
 
 * It's tailored to the database you're using, so database-specific field types
-  such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or ``integer
-  primary key autoincrement`` (SQLite) are handled for you automatically. Same
-  goes for the quoting of field names -- e.g., using double quotes or
-  single quotes.
+  such as ``auto_increment`` (MySQL), ``bigint PRIMARY KEY GENERATED BY DEFAULT
+  AS IDENTITY`` (PostgreSQL), or ``integer primary key autoincrement`` (SQLite)
+  are handled for you automatically. Same goes for the quoting of field names
+  -- e.g., using double quotes or single quotes.
 
 * The :djadmin:`sqlmigrate` command doesn't actually run the migration on your
   database - instead, it prints it to the screen so that you can see what SQL

+ 1 - 1
docs/ref/contrib/gis/tutorial.txt

@@ -258,7 +258,7 @@ This command should produce the following output:
     -- Create model WorldBorder
     --
     CREATE TABLE "world_worldborder" (
-        "id" bigserial NOT NULL PRIMARY KEY,
+        "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         "name" varchar(50) NOT NULL,
         "area" integer NOT NULL,
         "pop2005" integer NOT NULL,

+ 8 - 4
docs/ref/databases.txt

@@ -291,9 +291,9 @@ live for the duration of the transaction.
 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
+Django uses PostgreSQL's identity columns to store auto-incrementing primary
+keys. An identity 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::
 
@@ -310,7 +310,11 @@ If you need to specify such values, reset the sequence afterward 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/datatype-numeric.html#DATATYPE-SERIAL
+.. versionchanged:: 4.1
+
+    In older versions, PostgreSQL’s ``SERIAL`` data type was used instead of
+    identity columns.
+
 .. _sequence: https://www.postgresql.org/docs/current/sql-createsequence.html
 
 Test database templates

+ 1 - 1
docs/topics/db/models.txt

@@ -39,7 +39,7 @@ The above ``Person`` model would create a database table like this:
 .. code-block:: sql
 
     CREATE TABLE myapp_person (
-        "id" serial NOT NULL PRIMARY KEY,
+        "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
         "first_name" varchar(30) NOT NULL,
         "last_name" varchar(30) NOT NULL
     );