ONE to MANY关联表的ID主键跳数与POSTGRESQL
ID primary key of ONE to MANY related tables jumping numbers with POSTGRESQL
我遇到一个问题,table 的 users
和 posts
的 id
列以增量方式跳跃
users
并且有很多 notes
==> 一对多关系
table users
id | email | first_name | last_name | password
====================================
1 |1@a.com| john | den | 23ojonknen4
2 |2@a.com| jenn | dub | rfknkn4j4r4
5 |3@a.com| jai | dan | 9jikddjk4nj
table notes
id | note_name | note_content | user_id
=======================================
3 | name one | this is yes | 1
4 | name two | this is no | 5
正在发生的是两个 table 跳转的 id
列...如果笔记的 id 中有 3,那么下一个用户将是 4
我该如何解决这个问题?还是这正常?
这里是用于创建模式的 alembic 文件
from alembic import op
import sqlalchemy as sa
revision = 'master'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'users',
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("email", sa.String(254), nullable=False, index=True, unique=True),
sa.Column("first_name", sa.String(150), nullable=False),
sa.Column("last_name", sa.String(150), nullable=False),
sa.Column("password", sa.String(128), nullable=False),
)
op.create_table(
'notes',
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("note_name", sa.String(254)),
sa.Column("note_content", sa.String(254)),
sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id")),
)
def downgrade():
op.drop_table('users')
op.drop_table('notes')
这是我的 models.py
文件中的内容,用于 python 与数据库交互
from sqlalchemy import Table, Column, Integer, String, Float, Boolean, DateTime, MetaData, Sequence, ForeignKey
from sqlalchemy.orm import relationship
metadata = MetaData()
users = Table(
"users", metadata,
Column("id", Integer, primary_key=True),
Column("email", String(254), nullable=False, index=True, unique=True),
Column("first_name", String(150), nullable=False),
Column("last_name", String(150), nullable=False),
Column("password", String(128), nullable=False),
)
notes = Table(
"notes", metadata,
Column("id", Integer, primary_key=True),
Column("note_name", String(254)),
Column("note_content", String(254)),
Column("user_id", Integer, ForeignKey("users.id")),
)
我做错了什么,我该如何解决这个问题?
UPDATE
-# \d
List of relations
Schema | Name | Type | Owner
--------+------------------------+----------+--------------
public | alembic_version | table | db_user
public | pg_stat_statements | view | db_user
public | notes | table | db_user
public | notes_id_seq | sequence | db_user
public | users | table | db_user
public | users_id_seq | sequence | db_user
(6 rows)
-# \d users
Table "public.users"
Column | Type | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+--------------------------------------
id | integer | | not null | nextval('users_id_seq'::regclass)
email | character varying(254) | | not null |
first_name | character varying(150) | | not null |
last_name | character varying(150) | | not null |
password | character varying(128) | | not null |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
"ix_users_email" UNIQUE, btree (email)
Referenced by:
TABLE "notes" CONSTRAINT "notes_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
-# \d notes
Table "public.notes"
Column | Type | Collation | Nullable | Default
---------------------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('notes_id_seq'::regclass)
note_name | character varying(254) | | |
note_content | character varying(254) | | |
user_id | integer | | |
Indexes:
"notes_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"notes_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
这是一个示例查询,用于将行插入 users
table
query = "INSERT INTO users VALUES (nextval('users_id_seq'), :email, :password)"
return database.execute(query, values={"email": user.email, "password": user.password})
这是一个示例查询,用于将行插入 notes
table
query = "INSERT INTO notes VALUES (nextval('users_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
could this the issue?
query = "INSERT INTO notes VALUES (nextval('users_id_seq'),
:note_name, :note_content, :user_id)"
将nextval('users_id_seq')
更改为nextval('notes_id_seq')
?
what is happening is the id column of the two tables jump...if there is 3 in id of notes, then next if for users will be 4
how can i fix this issue? or is this normal?
是的,这完全正常。自动生成的数字不是严格连续的;引擎会尽最大努力使它们连续,但在缓冲、回滚、多线程等条件下,这在实践中不会发生。
您实际需要的关键功能是这些数字应始终唯一。如您所见,条件已满足,这就是保持数据完整性所需的全部内容。
修复是修复填充注释 table
的 INSERT
查询
来自
query = "INSERT INTO notes VALUES (nextval('users_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
到
query = "INSERT INTO notes VALUES (nextval('notes_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
这解决了我的问题
我遇到一个问题,table 的 users
和 posts
的 id
列以增量方式跳跃
users
并且有很多 notes
==> 一对多关系
table users
id | email | first_name | last_name | password
====================================
1 |1@a.com| john | den | 23ojonknen4
2 |2@a.com| jenn | dub | rfknkn4j4r4
5 |3@a.com| jai | dan | 9jikddjk4nj
table notes
id | note_name | note_content | user_id
=======================================
3 | name one | this is yes | 1
4 | name two | this is no | 5
正在发生的是两个 table 跳转的 id
列...如果笔记的 id 中有 3,那么下一个用户将是 4
我该如何解决这个问题?还是这正常?
这里是用于创建模式的 alembic 文件
from alembic import op
import sqlalchemy as sa
revision = 'master'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'users',
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("email", sa.String(254), nullable=False, index=True, unique=True),
sa.Column("first_name", sa.String(150), nullable=False),
sa.Column("last_name", sa.String(150), nullable=False),
sa.Column("password", sa.String(128), nullable=False),
)
op.create_table(
'notes',
sa.Column("id", sa.Integer, primary_key=True),
sa.Column("note_name", sa.String(254)),
sa.Column("note_content", sa.String(254)),
sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id")),
)
def downgrade():
op.drop_table('users')
op.drop_table('notes')
这是我的 models.py
文件中的内容,用于 python 与数据库交互
from sqlalchemy import Table, Column, Integer, String, Float, Boolean, DateTime, MetaData, Sequence, ForeignKey
from sqlalchemy.orm import relationship
metadata = MetaData()
users = Table(
"users", metadata,
Column("id", Integer, primary_key=True),
Column("email", String(254), nullable=False, index=True, unique=True),
Column("first_name", String(150), nullable=False),
Column("last_name", String(150), nullable=False),
Column("password", String(128), nullable=False),
)
notes = Table(
"notes", metadata,
Column("id", Integer, primary_key=True),
Column("note_name", String(254)),
Column("note_content", String(254)),
Column("user_id", Integer, ForeignKey("users.id")),
)
我做错了什么,我该如何解决这个问题?
UPDATE
-# \d
List of relations
Schema | Name | Type | Owner
--------+------------------------+----------+--------------
public | alembic_version | table | db_user
public | pg_stat_statements | view | db_user
public | notes | table | db_user
public | notes_id_seq | sequence | db_user
public | users | table | db_user
public | users_id_seq | sequence | db_user
(6 rows)
-# \d users
Table "public.users"
Column | Type | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+--------------------------------------
id | integer | | not null | nextval('users_id_seq'::regclass)
email | character varying(254) | | not null |
first_name | character varying(150) | | not null |
last_name | character varying(150) | | not null |
password | character varying(128) | | not null |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
"ix_users_email" UNIQUE, btree (email)
Referenced by:
TABLE "notes" CONSTRAINT "notes_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
-# \d notes
Table "public.notes"
Column | Type | Collation | Nullable | Default
---------------------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('notes_id_seq'::regclass)
note_name | character varying(254) | | |
note_content | character varying(254) | | |
user_id | integer | | |
Indexes:
"notes_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"notes_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)
这是一个示例查询,用于将行插入 users
table
query = "INSERT INTO users VALUES (nextval('users_id_seq'), :email, :password)"
return database.execute(query, values={"email": user.email, "password": user.password})
这是一个示例查询,用于将行插入 notes
table
query = "INSERT INTO notes VALUES (nextval('users_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
could this the issue?
query = "INSERT INTO notes VALUES (nextval('users_id_seq'), :note_name, :note_content, :user_id)"
将nextval('users_id_seq')
更改为nextval('notes_id_seq')
?
what is happening is the id column of the two tables jump...if there is 3 in id of notes, then next if for users will be 4
how can i fix this issue? or is this normal?
是的,这完全正常。自动生成的数字不是严格连续的;引擎会尽最大努力使它们连续,但在缓冲、回滚、多线程等条件下,这在实践中不会发生。
您实际需要的关键功能是这些数字应始终唯一。如您所见,条件已满足,这就是保持数据完整性所需的全部内容。
修复是修复填充注释 table
的INSERT
查询
来自
query = "INSERT INTO notes VALUES (nextval('users_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
到
query = "INSERT INTO notes VALUES (nextval('notes_id_seq'), :note_name, :note_content, :user_id)"
return database.execute(query, values={"note_name": note.name, "note_content": note.content, "user_id": user.id})
这解决了我的问题