为什么在 psql (rails app) 中不添加复合主键作为外键?
Why Composite Primary Key is not added as a Foreign Key in psql (rails app)?
我正在使用 activerecord-multi-tenant
gem 在我的 rails 项目中实施多租户。
已遵循 here
的说明
我有一个User
模型,Attendance
模型属于User
,Company
是租户。
当我将用户的 primary key(id)
更新为 composite key(id, company_id)
时,它正在更新。
但是当我尝试更新 Attendance
模型中的外键时,它只是试图将 user_id
作为 fk 并搜索其唯一约束。
这是我使用的命令-
execute 'ALTER TABLE users DROP CONSTRAINT users_pkey;'
execute 'ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY(id, company_id);'
execute 'ALTER TABLE attendances DROP CONSTRAINT attendances_pkey;'
execute 'ALTER TABLE attendances ADD CONSTRAINT attendances_pkey PRIMARY KEY (id, company_id);'
execute 'ALTER TABLE attendances ADD FOREIGN KEY(user_id, company_id) REFERENCES users(id, company_id);'
我在 schema:load
时遇到的错误
ActiveRecord::StatementInvalid: PG::InvalidForeignKey: ERROR: there is no unique constraint matching given keys for referenced table "users"
: ALTER TABLE "attendances" ADD CONSTRAINT "attendances_user_id_company_id_fkey"
FOREIGN KEY ("user_id")
REFERENCES "users" ("id")
解决方案是使用 structure.sql
文件。
在 schema.rb
文件中,它不能始终遵循 sql 命令并反映在数据库中。所以我收到此错误 InvalidForeignKey
,因为架构无法正确加载 sql 命令。
在移动到 structure.sql
之后,所有迁移都是 运行 正确的,文件中有确切的命令。
我正在使用 activerecord-multi-tenant
gem 在我的 rails 项目中实施多租户。
已遵循 here
的说明我有一个User
模型,Attendance
模型属于User
,Company
是租户。
当我将用户的 primary key(id)
更新为 composite key(id, company_id)
时,它正在更新。
但是当我尝试更新 Attendance
模型中的外键时,它只是试图将 user_id
作为 fk 并搜索其唯一约束。
这是我使用的命令-
execute 'ALTER TABLE users DROP CONSTRAINT users_pkey;'
execute 'ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY(id, company_id);'
execute 'ALTER TABLE attendances DROP CONSTRAINT attendances_pkey;'
execute 'ALTER TABLE attendances ADD CONSTRAINT attendances_pkey PRIMARY KEY (id, company_id);'
execute 'ALTER TABLE attendances ADD FOREIGN KEY(user_id, company_id) REFERENCES users(id, company_id);'
我在 schema:load
ActiveRecord::StatementInvalid: PG::InvalidForeignKey: ERROR: there is no unique constraint matching given keys for referenced table "users"
: ALTER TABLE "attendances" ADD CONSTRAINT "attendances_user_id_company_id_fkey"
FOREIGN KEY ("user_id")
REFERENCES "users" ("id")
解决方案是使用 structure.sql
文件。
在 schema.rb
文件中,它不能始终遵循 sql 命令并反映在数据库中。所以我收到此错误 InvalidForeignKey
,因为架构无法正确加载 sql 命令。
在移动到 structure.sql
之后,所有迁移都是 运行 正确的,文件中有确切的命令。